Seite 1 von 1

subprocess startet nicht, gültige pid trotzdem vorhanden?

Verfasst: Donnerstag 15. Mai 2008, 21:53
von ivka_sto
N'Abend :D


Ich glaube mir entgeht etwas bzgl. dem subprocess. Vielleicht weiß jemand mehr. Und zwar:

Wenn ich ein subprocess über Shell öffne, sagen wir ..

Code: Alles auswählen

proc = 'konquero ohne r'
cmd = subprocess.Popen(proc, shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
und dessen pid erfrage (also cmd.pid), bekomme ich doch auch dann eine pid, wenn kein subprocess am Laufen ist .. Wovon bekomme ich denn dann die pid? Von dem Shell - hab ich in einem anderen Posting gelesen. Aber wie komm ich dann an der pid von dem Programm selber, das ich gestartet habe (oder eben auch nicht)? Muß ich den mühsamen Weg über die lock-Files gehen?

Ganz analog mit dem returncode, der andauernd auf None steht, auch wenn kein subprocess gestartet werden konnte .. und nach meinem Wissen auf irgendeine Zahl > 0 (dem jeweiligen error code) stehen sollte. Entgeht mir was? Oder mach ich was grundsätzlich falsch?

Kurz zu dem Hintergrund: ich wollte (möglichst einfach) registrieren, wann (bzw. ob) ein als subprocess geöffnetes Programm auch wirklich gestartet ist, und habe dafür sowohl mit returncode und pid [wie oben beschrieben] rumexperimentiert, als auch mit communicate() [das aber erst dann stdo und stde zurückgibt, nachdem das Programm terminiert]
Mein Interesse ist mittlerweile mehr theoretisch (kennt man ja, man hat sich in einer Kleinigkeit so verbissen, daß man sie nicht mehr aus seinem Kopf kriegt) Und trotzdem werd ich keine schlauen Vorschläge zurückweisen :)

VG, ivka_sto

Verfasst: Freitag 16. Mai 2008, 00:52
von lunar
Tja, wieder einmal zeigt sich, warum man ``shell=True`` **nicht** benutzen sollte...

Warum führst du Prozess nicht einfach direkt ohne Umweg über die Shell aus, dann kriegst du auch den Returncode direkt.

Verfasst: Freitag 16. Mai 2008, 08:57
von Rebecca
Auch wenn es aus der Doku so nicht hervorgeht: Bei mir steht in returncode immer erst was drin, wenn ich poll aufgerufen habe.

Verfasst: Freitag 16. Mai 2008, 09:33
von BlackJack
Oder `wait()`. Bei `poll()` kann es ja passieren, dass der Prozess noch gar nicht zu ende ist und deswegen noch kein Rückgabewert da ist.

Verfasst: Sonntag 18. Mai 2008, 12:18
von ivka_sto
@lunar: Du meinst 'direkt' wie direkt mit os.system('befehl') oder wie? Ich hab doch schon mindestens 36457 Postings gg das böse os.system('') gelesen - daß es unschön und unsicher ist. Was spricht denn sonst gegen shell = True?

Verfasst: Sonntag 18. Mai 2008, 12:32
von lunar
``shell=True`` ist eigentlich genau das gleiche wie ``os.system`` und teilt all dessen Nachteile.

Du solltest – wie in der Dokumentation beschrieben – ``subprocess`` ohne ``shell=True`` mit einer Liste als Argument ausführen. Dann erhältst du nämlich eine schöne Ausnahme, wenn du eine nicht existierende Datei ausführen möchtest. Folgendes Snippet zeigt den Unterschied zwischen beiden Vorgehensweisen:

http://paste.pocoo.org/show/51165/

Verfasst: Sonntag 18. Mai 2008, 12:39
von mitsuhiko
shell=True sollte eine dicke, rote, fette, <blink>ende, 32pt große Warnung in der Doku bekommen. Jeder boon nutzt das ohne sich über die Konsequenzen bewusst zu sein. :?

Verfasst: Sonntag 18. Mai 2008, 19:04
von ivka_sto
Cool, danke :)