Seite 1 von 1

subprocess mit vereinten stdout + stderr ?!?

Verfasst: Dienstag 2. Juni 2015, 18:01
von jens
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?!?

Re: subprocess mit vereinten stdout + stderr ?!?

Verfasst: Dienstag 2. Juni 2015, 19:13
von jens
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?!?