Auf Windows kommando zeile zugreifen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich Dödel! :oops:

Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt. Als "normaler" String sieht das bei Python so aus:

Code: Alles auswählen

path = "c:\\Programme\\distyingyang02"
Leserlicher ist das aber als raw String:

Code: Alles auswählen

path = r"c:\Programme\distyingyang02"
@Leonidas: die Pfadangabe zu *.exe ist bei aber immer noch falsch. Entweder mit \ den Backslash escapen oder raw Strings benutzen. Bei der cwd-Angabe haste es ja richtig gemacht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

derdon hat geschrieben:Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt.
Das ist egal und löst das Problem nicht. Der Win-API ist es nämlich egal ob Slashes oder Backslashes im Pfad vorkommen. Die Lösung sieht so aus wie ich geschrieben habe: einfach den vollen Pfad angeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

derdon hat geschrieben:@Leonidas: die Pfadangabe zu *.exe ist bei aber immer noch falsch. Entweder mit \ den Backslash escapen oder raw Strings benutzen. Bei der cwd-Angabe haste es ja richtig gemacht.
Jein. Man sollte es machen und ich habe es editiert aber es macht keinen Unterschied in dem Fall, da weder ``\P``, ``\d`` noch ``\e`` Escape-Sequenzen sind, somit werden die ohne Änderungen weitergegeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Leonidas hat geschrieben:
derdon hat geschrieben:Das kommt davon, wenn man immer unter Linux programmiert...
Bei Windows wird \ zum statt / benutzt.
Das ist egal und löst das Problem nicht. Der Win-API ist es nämlich egal ob Slashes oder Backslashes im Pfad vorkommen. Die Lösung sieht so aus wie ich geschrieben habe: einfach den vollen Pfad angeben.
Ah, wieder was dazugelernt. Ganz schön schlau, diese Win-API...
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Es funktioniert!! Klasse!! Danke Leonidas!
nur ne ganz kurze Frage zum Verständnis: was bedeuten die kleinen r , und warum wurde der pfad nun in eckigen Klammern geschrieben?
aber danke schon mal vielmals für die Hilfe und die Erklärung.
Mit vielen Grüßen
Dango :D :D
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zu den "Klammern":
Python Doku hat geschrieben: "args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or the string if a string is given, but can be explicitly set by using the executable argument."
Man kann eben auch eine Sequenz übergeben.

Das "r" steht für raw-String und sorgt dafür, dass die "" innerhalb des Strings nicht als Escape-Sequenz interpretiert werden.
Python Doku hat geschrieben: String literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and use different rules for interpreting backslash escape sequences.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dango hat geschrieben:nur ne ganz kurze Frage zum Verständnis: was bedeuten die kleinen r , und warum wurde der pfad nun in eckigen Klammern geschrieben?
Die kleinen ``r`` stehen für Raw-String, d.h. die Escape-Sequenzen werden nicht ausgeführt. Also zum Beispiel '\n' ist ein Zeilenumbruch und wenn man 'C:\Programme\nbpython' hat, möchte man da ein '\n' haben und keinen Zeilenumbruch.

Der Pfad ist in eckigen Klammern weil die darunter liegende API die Prozesse startet eigentlich ein Array von Parametern erwartet. Wenn du ein Programm in der Eingabeaufforderung startest passiert auch nichts anderes dass die Eingabe nach bestimmten Regeln an Leerzeichen gespalten wird und dann an diese API funktion direkt übergeben wird. Genau diesen Zerlegungsschritt sparst du dir hier direkt, indem du direkt eine Liste übergibst. Das hat Vorteile zum beispiel wenn man irgendwelche Parameter mit übergeben will die Leerzeichen enthalten, die setzt man dann einfach in die Liste rein statt sie zu escapen und irgendwo in den String einzusetzen, wo sie dann sowieso wieder intern in eine Liste umgewantelt werden.

Hyperion, so einfach ist das mit der Sequenz eben nicht. Daher sollte man eigentlich immer eine Liste übergeben. Ab Python 2.5 kann man da nun ein Tupel übergeben, was in Python 2.4 noch nicht möglich war.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Super!! Vielen Dank euch beiden für die Erklärung!!
Ich find es einfach toll wie schnell und hilfsbereit hier die leute sind!
da stellt man gerne Fragen :D
Nochmal vielen Dank
Mit vielen Grüßen an alle die mir so toll geholfen haben
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Hallo erstmal Danke. Ihr konntet mir mit meinem Problem soweit helfen aber bei mir wird es jetzt interessanter.
Ich muss ein Programm aufrufen mit Parameterübergabe und Pfad

Code: Alles auswählen

subprocess.call([r'C:\Programme\Disney Interactive\Aladin blabla\bin\aladin.exe' -run -batch 'C:\Dokumente und Einstellungen\user\Desktop\Aladin\Model'], cwd=r"Programme\Disney Interactive\Aladin blabla\bin")
So hab wollte ich das dann nutzen
Bekomme immer ein Syntax Error wegen dem ' vor der ]

Code: Alles auswählen

SyntaxError: invalid syntax
Unter Windows geht es mit folgender Befehlzeile

Code: Alles auswählen

"c:\Programme\Disney Interactive\Aladin blabla\bin\aladin.exe" -run -batch "C:\Dokumente und Einstellungen\user\Desktop\Aladin\Model"
Danke im Vorraus
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Code: Alles auswählen

subprocess.call([r'C:\Programme\Disney Interactive\Aladin blabla\bin\aladin.exe',
     '-run', '-batch', r'C:\Dokumente und Einstellungen\user\Desktop\Aladin\Model'],
     cwd=r"Programme\Disney Interactive\Aladin blabla\bin")
Python kennt deine Parameter nicht, die uebergibst du als Liste von Strings. Ausserdem solltest du den zweiten Pfad besser auch als Raw-String deklarieren.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Danke


Gibt es jetzt noch die Möglichkeit das das Programm nur aufgerufen wird und nicht gewartet wird bis es wieder beendet wurde?
lunar

"call()" durch "Popen()" ersetzen ...
Antworten