subprocess und stdout

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
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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
BlackJack

@pPilger: Die Ausgabe wird aller Wahrscheinlichkeit nach nicht über `stdout` sondern über `stderr` laufen.
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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?
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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
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.
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Hmm, wie wäre es mit communicate?

Das liefert dir sowohl stdout als auch stderr zurück...
pPilger
User
Beiträge: 45
Registriert: Montag 8. Februar 2010, 17:30

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)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

=> 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
the more they change the more they stay the same
Antworten