What's the difference between subprocess Popen and call (how can I use them)?
--
Track title: CC G Dvoks String Quartet No 12 Ame 2
--
Chapters
00:00 Question
00:40 Accepted answer (Score 309)
02:39 Answer 2 (Score 56)
03:01 Thank you
--
Full question
https://stackoverflow.com/questions/7681...
Question links:
[the documentation]: http://docs.python.org/library/subproces...
Accepted answer links:
[subprocess.Popen]: http://docs.python.org/library/subproces...
[subprocess.call]: http://docs.python.org/library/subproces...
[subprocess.py]: http://hg.python.org/cpython/file/e0df7d...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #subprocess #popen
#avk47
ACCEPTED ANSWER
Score 321
There are two ways to do the redirect. Both apply to either subprocess.Popen or subprocess.call.
Set the keyword argument
shell = Trueorexecutable = /path/to/the/shelland specify the command just as you have it there.Since you're just redirecting the output to a file, set the keyword argument
stdout = an_open_writeable_file_objectwhere the object points to the
outputfile.
subprocess.Popen is more general than subprocess.call.
Popen doesn't block, allowing you to interact with the process while it's running, or continue with other things in your Python program. The call to Popen returns a Popen object.
call does block. While it supports all the same arguments as the Popen constructor, so you can still set the process' output, environmental variables, etc., your script waits for the program to complete, and call returns a code representing the process' exit status.
returncode = call(*args, **kwargs)
is basically the same as calling
returncode = Popen(*args, **kwargs).wait()
call is just a convenience function. It's implementation in CPython is in subprocess.py:
def call(*popenargs, timeout=None, **kwargs):
"""Run command with arguments. Wait for command to complete or
timeout, then return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
with Popen(*popenargs, **kwargs) as p:
try:
return p.wait(timeout=timeout)
except:
p.kill()
p.wait()
raise
As you can see, it's a thin wrapper around Popen.
ANSWER 2
Score 62
The other answer is very complete, but here is a rule of thumb:
callis blocking:call('notepad.exe') print('hello') # only executed when notepad is closedPopenis non-blocking:Popen('notepad.exe') print('hello') # immediately executed