subprocess startet nicht, gültige pid trotzdem vorhanden?

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.
Antworten
ivka_sto
User
Beiträge: 63
Registriert: Dienstag 11. Dezember 2007, 23:13

Donnerstag 15. Mai 2008, 21:53

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
lunar

Freitag 16. Mai 2008, 00:52

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 16. Mai 2008, 08:57

Auch wenn es aus der Doku so nicht hervorgeht: Bei mir steht in returncode immer erst was drin, wenn ich poll aufgerufen habe.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Freitag 16. Mai 2008, 09:33

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.
ivka_sto
User
Beiträge: 63
Registriert: Dienstag 11. Dezember 2007, 23:13

Sonntag 18. Mai 2008, 12:18

@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?
lunar

Sonntag 18. Mai 2008, 12:32

``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/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sonntag 18. Mai 2008, 12:39

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. :?
TUFKAB – the user formerly known as blackbird
ivka_sto
User
Beiträge: 63
Registriert: Dienstag 11. Dezember 2007, 23:13

Sonntag 18. Mai 2008, 19:04

Cool, danke :)
Antworten