Seite 1 von 1

subprocess :Ausgabetext "zurückbekommen"

Verfasst: Freitag 4. August 2017, 15:04
von drnicolas
Ich versuche mit subprocess ein externes Programm aufzurufen. Das funktioniert auch prima mit verschiedenen Methoden des subprocess Moduls.

Mit subprocess.check_output bekomme ich einen Fehler wenn die Rückgabe non-Zero ist.
Mit subprocess.call bekomme ich immerhin den Return-Wert, was schonmal prima ist, da dieser bestimmt was weiter gemacht werden muss.
Das Programm gibt aber noch einen text mit einem bestimmten Wert aus, den ich gerne hätte. Und daran scheitere ich .

Lt. Doku soll man dazu subrprocess.Popen nehmen und stdout=PIPE setzen.
Also so etwa:

Code: Alles auswählen

outp=subprocess.Popen(<Programm mit Args>, stdout=subprocess.PIPE)
print( outp.stdout.read())
Da kommt aber immer nur nix - Jedenfalls nicht mein Ausgabetext.
Was mache ich da falsch?

Übrigens soll Popen warten bis der Prozess fertig ist. Und den returncode hätte ich obendrein gerne

Re: subprocess :Ausgabetext "zurückbekommen"

Verfasst: Freitag 4. August 2017, 16:01
von __deets__
Versuch mal Popen.communicate.

Code: Alles auswählen

p = subprocess.Popen([command, arg, ..], stdout=subprocess.PIPE)
stdout, _ = p.communicate()

Re: subprocess :Ausgabetext "zurückbekommen"

Verfasst: Freitag 4. August 2017, 17:30
von drnicolas
Leider nix.
hier mal der Code:

Code: Alles auswählen

test=subprocess.Popen(['identify', f], stdout=subprocess.PIPE)
stdout, _= test.communicate()
Was muss ich dann noch machen? stdout ist leer (wenn es denn eine Variable ist)
Sollte aber irgendeinen Text enthalten. Der Text wird mir zumindest in Pydev beim Debuggen angezeigt

Re: subprocess :Ausgabetext "zurückbekommen"

Verfasst: Freitag 4. August 2017, 17:40
von __deets__
Kann es sein das dein Programm nach stderr schreibt? Dann musst du auch das als PIPE angeben, und das ist der zweite, im Moment ignorierte Rueckgabewert von communicate().

Re: subprocess :Ausgabetext "zurückbekommen"

Verfasst: Freitag 4. August 2017, 19:48
von drnicolas
Danke ! Das wars! Das Ding schreibt schlicht woanders hin.