Seite 1 von 1

stdout/err lesen aber nicht ausgeben

Verfasst: Mittwoch 16. Dezember 2009, 12:59
von newc0mer
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.

Re: stdout/err lesen aber nicht ausgeben

Verfasst: Mittwoch 16. Dezember 2009, 13:27
von Hyperion
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?

Verfasst: Mittwoch 16. Dezember 2009, 14:14
von newc0mer
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)

Verfasst: Mittwoch 16. Dezember 2009, 17:20
von BlackJack
@newc0mer: Ich denke mal, da erinnerst Du Dich falsch.

Verfasst: Mittwoch 16. Dezember 2009, 19:54
von lunar
Soll heißen, "shell=True" aus dem Aufruf entfernen.

Verfasst: Mittwoch 16. Dezember 2009, 22:07
von newc0mer
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...

Verfasst: Mittwoch 16. Dezember 2009, 22:47
von 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.

Verfasst: Mittwoch 16. Dezember 2009, 23:12
von newc0mer
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...