Zap hat geschrieben:Erstens
kann deine zweite Version überhaupt nicht funktionieren...
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.