Seite 2 von 2

Verfasst: Sonntag 14. Dezember 2008, 18:33
von Hyperion
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.

Verfasst: Sonntag 14. Dezember 2008, 18:34
von Leonidas
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.

Verfasst: Sonntag 14. Dezember 2008, 20:20
von Dango
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

Verfasst: Donnerstag 22. Januar 2009, 09:22
von madthomas
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

Verfasst: Donnerstag 22. Januar 2009, 09:44
von Rebecca

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.

Verfasst: Donnerstag 22. Januar 2009, 10:02
von madthomas
Danke


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

Verfasst: Donnerstag 22. Januar 2009, 11:36
von lunar
"call()" durch "Popen()" ersetzen ...