stdout/err lesen aber nicht ausgeben

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
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

hallo

ich lesen via subprocess.popen() mittels PIPE alles von stderr und stdout in eine variable. das geht sehr gut. nun aber wird der stderr von popen() auch noch auf der Bash ausgegeben, was ich aber nicht möchte. ich möchte den stderr aus meiner variable schön formatiert ausgeben...

wie kann ich das nun verhindern, dass popen() stderr auf der console ausgibt.
das py script wird auf der bash gestartet und ausgeführt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

newc0mer hat geschrieben: ich lesen via subprocess.popen() mittels PIPE alles von stderr und stdout in eine variable. das geht sehr gut. nun aber wird der stderr von popen() auch noch auf der Bash ausgegeben, was ich aber nicht möchte. ich möchte den stderr aus meiner variable schön formatiert ausgeben...
Hast Du shell=True im Aufruf stehen?
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

ja. ohne shell=True bekomme ich nix von stdout und stderr wie ich mich errinnere.
atm mache ich es so:

Code: Alles auswählen

subprocess.Popen(cmd, shell=True, bufsize=0, executable=None, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
BlackJack

@newc0mer: Ich denke mal, da erinnerst Du Dich falsch.
lunar

Soll heißen, "shell=True" aus dem Aufruf entfernen.
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

ich bekomm dann nen OSError: [

Code: Alles auswählen

Errno 2] No such file or directory
es wird also mein cmd nicht mehr als command erkannt - er möchte des zeug immer im directory, wo er grad is, ausführen.. vllt auch env path probleme?

der befehl heisst z.b. "iptables --flush" (der befehl ist korrekt und rechte stimmen)

ich sehe zwar die stdout meldung auf der bash nicht mehr (cool!) aber kann den befehl auch nicht richtig verarbeiten...
BlackJack

Es gibt ja auch kein Programm mit dem Namen 'iptables --flush'. Das Programm heisst nur 'iptables' und '--flush' ist ein Argument. Wenn man keine Shell dazwischen schaltet, muss man das Programm und die Argumente schon getrennt übergeben, zum Beispiel als Liste.
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

wo muss man denn diese argumente übergeben?

Code: Alles auswählen

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)¶
edit "ok": args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence

muss den noch bisserl nachgehen...
Antworten