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?!?