Wie fange ich mein Stderr ab (Kurze Frage?)

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
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Hallo,

ich möchte mit folgendem Code den stderr als String abgreifen, weiß aber nicht wie ich daran komme:

Code: Alles auswählen

import subprocess

prog= subprocess.call(['cmd.exe','dir'],stderr=subprocess.STDOUT)
da bekomme ich dann als Antwort, dass das Filehandle ungültig ist.
nehme ich

Code: Alles auswählen

subprocess.check_output
bekommeich nur ein INT als Wert, was mir auch nicht hilft...


ich kann nicht popen benutzen, weil es wichtig ist, dass mein indiziertes.Programm abgeschlossen ist bevor es weitergeht...
Zuletzt geändert von Bluekobalt am Donnerstag 22. Oktober 2009, 09:23, insgesamt 1-mal geändert.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Code: Alles auswählen

In [7]: a = subprocess.Popen("sleep 5 && echo Output", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

In [8]: a.wait()
Out[8]: 0

In [9]: a.communicate()
Out[9]: ('Output\n', None)
Alternativ könnte man stderr auch ein dateiähnliches Objekt übergeben. Allerdings greift subprocess auf die fileno() Methode (Liefert den Dateideskriptor, gibt sicherlich keine einfache Methode sowas zu emulieren) zu, weswegen es mit zb einem StringIO Objekt nicht funktioniert.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Also erstmal vielen Dank für Deine Hilfe, dass Thema scheint ja schwieriger zu sein als ich erst dachte

Mein problem jetzt:

Code: Alles auswählen

self.proc = subprocess.Popen( args, "sleep 5 && echo Output", stdout=subprocess.PIPE,  stderr=subprocess.PIPE)
            self.proc.wait()
            self.proc.communicate()
so funzt es nicht, weil er bufsize kein INT ist :twisted:
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

"Errorcode als String" :

Seh dir die Hilfe zu subprocess an:
http://docs.python.org/library/subprocess.html

(und ganz besonders die parameter von Popen)
Popen.returncode¶

The child return code, set by poll() and wait() (and indirectly by communicate()). A None value indicates that the process hasn’t terminated yet.
Den int zu einem string konvertieren und fertig.

Der Errorcode hat nichts mit STDERR zu tun.
Und wie du die STDOUT und STDERR Channels liest wurde dir ja oben schon gezeigt.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

hilft mir leider überhaupt nicht !

das manuel habe ich schon gelesen, hat mich auch nicht weiter gebracht.

das mit dem ERRCODE war falsch, der Rest von deinem Kommentar nur Klugscheisserei
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bluekobalt hat geschrieben:hilft mir leider überhaupt nicht !
Dein Quellcode auch nicht! ;-)

Außer, dass Du den Aufruf von Popen nicht wirklich kapiert hast:

Code: Alles auswählen

"sleep 5 && echo Output"
Ist hier wenig sinnvoll...
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

der war auch nicht von mir ("sleep 5 && echo Output")
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Hyperion sagte, dass in Deinem Code das "sleep 5 && echo Output" an der Stelle, an der Du es stehen hast, keinen Sinn macht . Und recht hat er :) (btw, str1442 hat es in seinem Beitrag durchaus an der richtigen Stelle stehen, allerdings war es von ihm nur als Beispiel gedacht.)
(Bluekobalt)

Code: Alles auswählen

self.proc = subprocess.Popen( args, "sleep 5 && echo Output", stdout=subprocess.PIPE,  stderr=subprocess.PIPE)
            self.proc.wait()
            self.proc.communicate()
so funzt es nicht, weil er bufsize kein INT ist
(Bluekobalt)
(Mad-Marty)
Den int zu einem string konvertieren und fertig.

Der Errorcode hat nichts mit STDERR zu tun.
Und wie du die STDOUT und STDERR Channels liest wurde dir ja oben schon gezeigt.
das mit dem ERRCODE war falsch, der Rest von deinem Kommentar nur Klugscheisserei
Ich finde es etwas ungut (um es mal vorsichtig auszudrücken), dass Du Mad-Marty Deinen (!) obigen Fehler ankreidest, und ihn auch noch der "Klugscheisserei" bezichtigst, obwohl er Dir nur die korrekte Lösung Deines Problems geschrieben hat.
Bluekobalt
User
Beiträge: 26
Registriert: Montag 20. Juli 2009, 11:08

Für meine schroffen Art gestern, ich war tatsächlich total angepisst, weil ich das gestern ums verrecken nichts gebacken bekommen habe. Das ist natürlich keine Entschuldigung für mein Verhalten, aber vielleicht eine Erklärung.

So und jetzt noch vielen Dank für eure Hilfe, ich setze mich gleich wieder ran und probiere es aus.[/b]
Antworten