subprocess mit vereinten stdout + stderr ?!?

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Im Prinzip gibt es bei https://stackoverflow.com/questions/114 ... -to-stdout eine Lösung.

Im Prinzip also:

Code: Alles auswählen

subprocess.Popen(foo, stdout=subprocess.PIPE, stderr=sys.stdout.fileno()
Aber funktioniert das wirklich zuverlässig?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es gibt ja auch subprocess.STDOUT...

Das geht unter Linux mit Python 3:

Code: Alles auswählen

from __future__ import print_function

import subprocess
import sys
import os


def start():
    print("+++start()")
    popen_args = [
        sys.executable, os.path.abspath(__file__), "run",
    ]
    print("Call:", popen_args)
    process = subprocess.Popen(popen_args,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        universal_newlines=True,
    )
    stdout, stderr = process.communicate()
    retcode = process.poll()

    print("return code: %r" % retcode)
    print(" **** stdout:\n", stdout)
    print(" **** stderr:\n", stderr)

    print("+++start() - END")


def run():
    print("+++run()")
    for i in range(10):
        if i % 2:
            sys.stdout.write("stdout %i\n" % i)
            sys.stdout.flush()
        else:
            sys.stderr.write("stderr %i\n" % i)
            sys.stderr.flush()
    print("+++rund() - END")

if __name__ == "__main__":
    if not "run" in sys.argv:
        start()
    else:
        run()
Ausgabe ist dann:

Code: Alles auswählen

+++start()
Call: ['/usr/bin/python3', '/home/jens/test.py', 'run']
return code: 0
 **** stdout:
 stderr 0
+++run()
stdout 1
stderr 2
stdout 3
stderr 4
stdout 5
stderr 6
stdout 7
stderr 8
stdout 9
+++rund() - END

 **** stderr:
 None
+++start() - END
Wenn ich die beiden flush() Aufrufe weg lasse, sieht es natürlich anders aus:

Code: Alles auswählen

+++start()
Call: ['/usr/bin/python3', '/home/jens/test.py', 'run']
return code: 0
 **** stdout:
 stderr 0
stderr 2
stderr 4
stderr 6
stderr 8
+++run()
stdout 1
stdout 3
stdout 5
stdout 7
stdout 9
+++rund() - END

 **** stderr:
 None
+++start() - END
Aber geht das auch mit Python 2.7 und auch unter Windows?

EDIT: subprocess.STDOUT Gibt es schon seid Python 2.6: https://docs.python.org/2.6/library/sub ... ess.STDOUT

Also wird es auch überall funktionieren?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten