Video in loop abspielen

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.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

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!
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.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

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!?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

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:
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
dirty sanchez
User
Beiträge: 42
Registriert: Freitag 27. Juni 2008, 12:21

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)
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.
Antworten