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