Seite 1 von 1
subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 10:21
von pPilger
Hallo,
ich habe ein Problem mit der Ausgabe der Meldungen aus dem subprocess:
Hier erhalte ich die Ausgaben:
Code: Alles auswählen
p = subprocess.Popen(["C:\\lame\\lame.exe", "--help"], stdout=subprocess.PIPE)
hier nicht:
Code: Alles auswählen
p = subprocess.Popen(["C:\\lame\\lame.exe", "C:\\lame\\test.mp3", "C:\\lame\\test1_pc.mp3"], stdout=subprocess.PIPE)
Wo liegt da mein Denkfehler?
Ausgeführt wird er korrekt.
Danke,
Jörg
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 10:29
von BlackJack
@pPilger: Die Ausgabe wird aller Wahrscheinlichkeit nach nicht über `stdout` sondern über `stderr` laufen.
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 11:08
von pPilger
BlackJack hat geschrieben:@pPilger: Die Ausgabe wird aller Wahrscheinlichkeit nach nicht über `stdout` sondern über `stderr` laufen.
So einfach wie ich dachte geht das doch nicht. Wie kann ich denn stdtout UND stderr abfangen?
Code: Alles auswählen
p = subprocess.Popen(["C:\\lame\\lame.exe", "C:\\lame\\test.mp3", "C:\\lame\\test1_pc.mp3"], stderr=subprocess.PIPE)
File "C:\Python26\lib\subprocess.py", line 614, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "C:\Python26\lib\subprocess.py", line 735, in _get_handles
c2pwrite = self._make_inheritable(c2pwrite)
File "C:\Python26\lib\subprocess.py", line 761, in _make_inheritable
DUPLICATE_SAME_ACCESS)
WindowsError: [Error 6] Das Handle ist unguelti
"communicate" ist ja wohl eher dazu gedacht Ein UND Ausgaben zu realisieren?
Grüße,
Jörg
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 11:22
von pPilger
BlackJack hat geschrieben:@pPilger: Die Ausgabe wird aller Wahrscheinlichkeit nach nicht über `stdout` sondern über `stderr` laufen.
Wenn ich es so mache, bleibt der subprocess hängen:
Code: Alles auswählen
p = subprocess.Popen(["C:\\lame\\lame.exe", "C:\\lame\\test.mp3", "C:\\lame\\test1_pc.mp3"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Genauer gesagt, sind mir die Ausgaben eigentlich nicht so wichtig. Was ich benötige ist eine Rückmeldung, ob der subprocess erfolgreich war.
Dank für die Hilfe
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 11:27
von pPilger
pPilger hat geschrieben:
Genauer gesagt, sind mir die Ausgaben eigentlich nicht so wichtig. Was ich benötige ist eine Rückmeldung, ob der subprocess erfolgreich war.
Ok, das ist mein Freund:
Code: Alles auswählen
p = subprocess.call(["C:\\lame\\lame.exe", "C:\\lame\\test_.mp3", "C:\\lame\\test2_pc.mp3"])
Muss ich da noch was beachten?
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 19:00
von pPilger
Ok, das ist mein Freund:
Code: Alles auswählen
p = subprocess.call(["C:\\lame\\lame.exe", "C:\\lame\\test_.mp3", "C:\\lame\\test2_pc.mp3"])
Aber warum funktioniert es bei der Angabe eines zus. ARGs nicht mehr?:
Code: Alles auswählen
p = subprocess.call(["C:\\lame\\lame.exe", '--tt "titel"', "C:\\lame\\test_.mp3", "C:\\lame\\test2_pc.mp3"])
Der Subprozess wirft einen Fehler, das Pythonscript aber nicht. Nun versuche ich den Fehler so zu ermitteln:
Wenn ich versuche die Fehlermeldung abzufangen erhalte ich folgende Meldung:
Code: Alles auswählen
p = subprocess.Popen(cmd_1, stderr=subprocess.PIPE )
for line in p.stderr:
print line
Da bekomme ich folgende Pythonfehlermeldung:
Code: Alles auswählen
p = subprocess.Popen(cmd_1, stderr=subprocess.PIPE )
File "C:\Python26\lib\subprocess.py", line 614, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "C:\Python26\lib\subprocess.py", line 735, in _get_handles
c2pwrite = self._make_inheritable(c2pwrite)
File "C:\Python26\lib\subprocess.py", line 761, in _make_inheritable
DUPLICATE_SAME_ACCESS)
WindowsError: [Error 6] Das Handle ist unguelti
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 19:21
von BlackJack
@pPilger: Das was Du da machst wäre auf der Kommandozeile ``lame "--tt titel" ...``, das würde auch dort nicht funktionieren. Das sind *zwei* Argumente die zusammen *eine* Option ergeben.
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 20:15
von pPilger
BlackJack hat geschrieben:@pPilger: Das was Du da machst wäre auf der Kommandozeile ``lame "--tt titel" ...``, das würde auch dort nicht funktionieren. Das sind *zwei* Argumente die zusammen *eine* Option ergeben.
Hallo,
Aber die Anführungszeichen sind doch nur um "Titel" herum, das ist doch korrekt so, und muss auch so sein, sonst gibts Probleme bei Leerzeichen...
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 20:23
von Leonidas
Die Einträge in der Liste sind schon "gesamte" Argumente, sie müssen nicht gequotet werden, weil es keine Shell gibt, die diese Argumente nach Whitespace splitten würde:
``--title "Foo Bar"`` ist dann ["--title", "Foo Bar"], weil das ja auch in der Shell zwei Argumente sind.
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 20:37
von pPilger
Leonidas hat geschrieben:Die Einträge in der Liste sind schon "gesamte" Argumente, sie müssen nicht gequotet werden, weil es keine Shell gibt, die diese Argumente nach Whitespace splitten würde:
``--title "Foo Bar"`` ist dann ["--title", "Foo Bar"], weil das ja auch in der Shell zwei Argumente sind.
OK, danke, das hab ich jetzt kapiert.
Aber wie bekomme ich jetzt etwaige Fehlermeldungen?
So erhalte ich einen Fehler:
Code: Alles auswählen
p = subprocess.call([c_lame_encoder, c_id3_title, c_id3_title_value, c_source_file, c_dest_file], stderr=subprocess.PIPE)
for line in p.stderr:
print line
Code: Alles auswählen
p = subprocess.call([c_lame_encoder, c_id3_title, c_id3_title_value, c_source_file, c_dest_file], stderr=subprocess.PIPE)
File "C:\Python26\lib\subprocess.py", line 470, in call
return Popen(*popenargs, **kwargs).wait()
File "C:\Python26\lib\subprocess.py", line 614, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "C:\Python26\lib\subprocess.py", line 735, in _get_handles
c2pwrite = self._make_inheritable(c2pwrite)
File "C:\Python26\lib\subprocess.py", line 761, in _make_inheritable
DUPLICATE_SAME_ACCESS)
WindowsError: [Error 6] Das Handle ist ung\Uffffffff\u0591\Uffffffff(\Uffffffff
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 20:48
von ravenheart
Hmm, wie wäre es mit communicate?
Das liefert dir sowohl stdout als auch stderr zurück...
Re: subprocess und stdout
Verfasst: Mittwoch 10. November 2010, 21:06
von pPilger
ravenheart hat geschrieben:Hmm, wie wäre es mit communicate?
Das liefert dir sowohl stdout als auch stderr zurück...
Dann so?
Code: Alles auswählen
p = subprocess.Popen([c_lame_encoder, c_id3_title, c_id3_title_value, c_source_file, c_dest_file])
x = p.communicate()
print x
Hier erhalte ich dann nur ein leeres Tuple: (None, None)
Re: subprocess und stdout
Verfasst: Donnerstag 11. November 2010, 16:57
von Dav1d
=> Es gibt keine Ausgabe...
Du kannst auch den Exit-Status überprüfen (p.returncode)
//Edit: Falsch, es gibt schon eine Ausgabe, du brauchst: stdout=subprocss.PIPE, stderr=subprocess.PIPE, aber das ist sehr ausführlich in der Doku beschrieben