问题
I'm trying to get output of another script, using Python's subprocess.Popen
like follows
process = Popen(command, stdout=PIPE, shell=True)
exitcode = process.wait()
output = process.stdout.read() # hangs here
It hangs at the third line, only when I run it as a python script and I cannot reproduce this in the python shell.
The other script prints just a few words and I am assuming that it's not a buffer issue.
Does anyone has idea about what I am doing wrong here?
回答1:
You probably want to use .communicate() rather than .wait()
plus .read()
. Note the warning about wait()
on the subprocess
documentation page:
Warning This will deadlock when using
stdout=PIPE
and/orstderr=PIPE
and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Usecommunicate()
to avoid that.
http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait
回答2:
read() waits for EOF before returning.
You can:
- wait for the subprocess to die, then read() will return.
- use readline() if your output is broken into lines (will still hang if no output lines).
- use os.read(F,N) which returns at most N bytes from F, but will still block if the pipe is empty (unless O_NONBLOCK is set on the fd).
回答3:
You can see how to deal with hanging reading of stdout/stderr in the next sources:
readingproc
来源:https://stackoverflow.com/questions/14433712/python-popen-stdout-read-hang