Python read from subprocess stdout and stderr separately while preserving order -


i have python subprocess i'm trying read output , error streams from. have working, i'm able read stderr after i've finished reading stdout. here's looks like:

process = subprocess.popen(command, stdout=subprocess.pipe, stderr=subprocess.pipe) stdout_iterator = iter(process.stdout.readline, b"") stderr_iterator = iter(process.stderr.readline, b"")  line in stdout_iterator:     # stuff line     print line  line in stderr_iterator:     # stuff line     print line 

as can see, stderr loop can't start until stdout loop completes. how can modify able read both in correct order lines come in?

to clarify: still need able tell whether line came stdout or stderr because treated differently in code.

the code in question may deadlock if child process produces enough output on stderr (~100kb on linux machine).

there communicate() method allows read both stdout , stderr separately:

from subprocess import popen, pipe  process = popen(command, stdout=pipe, stderr=pipe) output, err = process.communicate() 

if need read streams while child process still running portable solution use threads (not tested):

from subprocess import popen, pipe threading import thread queue import queue # python 2  def reader(pipe, queue):     try:         pipe:             line in iter(pipe.readline, b''):                 queue.put((pipe, line))     finally:         queue.put(none)  process = popen(command, stdout=pipe, stderr=pipe, bufsize=1) q = queue() thread(target=reader, args=[process.stdout, q]).start() thread(target=reader, args=[process.stderr, q]).start() _ in range(2):     source, line in iter(q.get, none):         print "%s: %s" % (source, line), 

see:


Comments

Popular posts from this blog

python - pip install -U PySide error -

arrays - C++ error: a brace-enclosed initializer is not allowed here before ‘{’ token -

cytoscape.js - How to add nodes to Dagre layout with Cytoscape -