Seite 1 von 2

Verfasst: Montag 14. Juli 2008, 14:26
von lunar
dirty sanchez hat geschrieben:wofür gibts denn das forum?
Ganz sicher nicht, um dir die Dokumentation vorzulesen oder Google für dich zu bedienen.
wenn jeder ewig zeit hätte, würde mal wohl irgendwann die lösung seiner probleme alleine finden. also kann mir jemand weiterhelfen?
Du erwartest also, dass andere sich die Zeit nehmen, die du nicht für Recherche in Dokumentationen oder fürs Googlen verwenden willst? Habe ich das so richtig verstanden?

Verfasst: Dienstag 15. Juli 2008, 10:58
von dirty sanchez
nein das erwarte ich nicht, aber es gibt leute die das ja schon wissen!

Verfasst: Dienstag 15. Juli 2008, 12:23
von audax
Und die haben, um ihr Wissen weiter zu geben, die Dokumentation geschrieben!

Verfasst: Dienstag 15. Juli 2008, 12:30
von dirty sanchez
alles klar

Verfasst: Dienstag 15. Juli 2008, 12:33
von HWK

Verfasst: Mittwoch 16. Juli 2008, 08:24
von dirty sanchez
danke, noch ne frage:

subprocess.Popen(arg, shell=True)

was genau macht das shell=True? die cracks raten einem ja ohne shell, sondern mit argument in Liste zu schreiben:

subprocess.Popen([arg])

wie genau muss arg dann aussehen wenn der pfad meines players, -loop und der pfad der abzuspielenden dateien drinstehen soll?
dazu kommt noch, wenn ichs mit subprocess.call mache kann ich meine gui nicht bedienen solange der player läuft!?

schonmal im voraus danke!

Verfasst: Mittwoch 16. Juli 2008, 09:29
von BlackJack
`arg` muss dann eine Liste mit den einzelnen Argumenten sein. Du musst also das machen, was sonst die Shell macht, mit dem Vorteil, dass Du einfach exakt das schreibst, was auch wirklich beim Programm ankommen soll und nicht darauf achten musst, das bestimmte spezielle Zeichen, die von Shell zu Shell unterschiedlich sein können, besonders geschützt werden müssen. Siehe snafu's `subprocess.call()`-Beispiel ganz am Anfang.

`subprocess.call()` blockiert in der Tat solange bis das externe Programm zuende ist.

Verfasst: Mittwoch 16. Juli 2008, 09:57
von dirty sanchez
ok also er ersetze ich subprocess.Popen(arg, shell=True),

subprocess.Popen([arg]) gibt bei mir jedoch ein fehler, also hab ich rumprobiert und

subprocess.Popen(arg) funktioniert wieder da arg bei mir so aussieht:
"C:\Program Files\MPlayer for Windows\MPUI.exe" -loop C:\Videos\videofile.mpg

kann man das so lassen?

Verfasst: Mittwoch 16. Juli 2008, 10:10
von Leonidas

Code: Alles auswählen

subprocess.Popen(["C:\Program Files\MPlayer for Windows\MPUI.exe", "-loop", "C:\Videos\videofile.mpg"])
Also so schwer war das jetzt nicht.

Verfasst: Mittwoch 16. Juli 2008, 10:18
von dirty sanchez
nein das habe ich nicht gemeint, sondern was der unterschied zwischen

subprocess.Popen(["C:\Program Files\MPlayer for Windows\MPUI.exe", "-loop", "C:\Videos\videofile.mpg"])

und

subprocess.Popen("C:\Program Files\MPlayer for Windows\MPUI.exe" -loop C:\Videos\videofile.mpg)

ist!?

Verfasst: Mittwoch 16. Juli 2008, 10:30
von Hyperion
dirty sanchez hat geschrieben: subprocess.Popen("C:\Program Files\MPlayer for Windows\MPUI.exe" -loop C:\Videos\videofile.mpg)
Das soll funktionieren? :shock:

Und es gibt code-tags hier im Board btw ;-)

Wieso guckst Du nicht in die Doku:
doku hat geschrieben: args should be a string, or a sequence of program arguments.
Also entweder packst Du den Aufruf in einen String oder eben Du splittest alles und nutzt eine Liste. Leonidas hat Dir doch eine gute Lösung präsentiert.

Verfasst: Mittwoch 16. Juli 2008, 10:34
von dirty sanchez
arg = "C:\Program Files\MPlayer for Windows\MPUI.exe" -loop C:\Videos\videofile.mpg -> arg ist ja mein string und das funktioniert auch
subprocess.Popen(arg)

ich wollte eigentlich nur wissen ob es einen unterschied macht ob als string oder eine liste der argumente!? ist eine variante besser als die andere :wink:

Verfasst: Mittwoch 16. Juli 2008, 10:42
von Zap
Erstens kann deine zweite Version überhaupt nicht funktionieren... :shock:

Zweitens: Der Unterschied bei der Verwendung eines einfachen Strings und einer Liste von Argumenten als Parameter liegt darin, dass du dich nicht um das so genannte Quoten kümmen musst. D.h, dass Parameter die Leerzeichen beinhalten entsprechend in Anführungszeichen gesetzt werden usw.

Verfasst: Mittwoch 16. Juli 2008, 10:56
von dirty sanchez
also vielen dank an alle :)

@Zap
ja gut es fehlen die hochkomma, aber so funktionierts sicher! habs ja im einsatz:
arg = '"C:\Program Files\MPlayer for Windows\MPUI.exe" -loop C:\Videos\videofile.mpg'
subprocess.Popen(arg)

Verfasst: Mittwoch 16. Juli 2008, 13:32
von lunar
Zap hat geschrieben:Erstens kann deine zweite Version überhaupt nicht funktionieren... :shock:
subprocess.Popen gibt das erste Argument eigentlich unverändert an os.exec* bzw. CreateProcess weiter. Ersteres nimmt unter Unix auch einen einzigen String entgegen, interpretiert ihn aber als aufzurufendes Kommando, weswegen die Übergabe eines einzelnen Strings unter Unix nicht funktioniert, wenn man Argumente übergeben möchte.

Unter Windows funktioniert die Stringvariante allerdings immer. Hintergrund ist, dass Windows nicht in jeder Version das POSIX-Subsystem enthält, und exec() unter Windows ergo nicht zuverlässig funktioniert.

Deswegen nutzt "subprocess" "CreateProcess" aus der win32 API, die einen String entgegen nimmt. Deswegen konvertiert subprocess eine übergebene Liste mit einer bestimmten Funktion in einen solchen String.

Der Aufruf:

Code: Alles auswählen

subprocess.Popen(["C:\Program Files\MPlayer for Windows\MPUI.exe", "-loop", "C:\Videos\videofile.mpg"])
ist unter Windows faktisch äquivalent zu:

Code: Alles auswählen

subprocess.Popen('"C:\Program Files\MPlayer for Windows\MPUI.exe" -loop "C:\Videos\videofile.mpg"')
Trotzdem sollte man die Liste verwenden, um sich nicht selbst ums Quoting kümmern zu müssen.