I've had a look at the documentation for both of them.
This question is prompted by J.F.'s comment here: Retrieving the output of subprocess.call()
The current Python documentation for subprocess.call()
says the following about using PIPE
for subprocess.call()
:
Note Do not use
stdout=PIPE
orstderr=PIPE
with this function. The child process will block if it generates enough output to a pipe to fill up the OS pipe buffer as the pipes are not being read from.
Python 2.7 subprocess.call()
:
Note Do not use
stdout=PIPE
orstderr=PIPE
with this function as that can deadlock based on the child process output volume. Use Popen with the communicate() method when you need pipes.
Python 2.6 includes no such warnings.
Also, the subprocess.call()
and subprocess.check_call()
don't seem to have a way to access their output, except for using stdout=PIPE with communicate():
https://docs.python.org/2.6/library/subprocess.html#convenience-functions
Note that if you want to send data to the process’s
stdin
, you need to create thePopen
object withstdin=PIPE
. Similarly, to get anything other than None in the result tuple, you need to givestdout=PIPE
and/orstderr=PIPE
too.
https://docs.python.org/2.6/library/subprocess.html#subprocess.Popen.communicate
What difference between subprocess.call()
and subprocess.Popen()
makes PIPE
less secure for subprocess.call()
?
More Specific: Why does subprocess.call()
"deadlock based on the child process output volume.", and not Popen()
?