What is the difference between
If you check out the subprocess section of the Python docs, you’ll notice there is an example of how to replace
sts = os.system("mycmd" + " myarg")
…does the same thing as…
sts = Popen("mycmd" + " myarg", shell=True).wait()
The “improved” code looks more complicated, but it’s better because once you know
subprocess.Popen(), you don’t need anything else.
subprocess.Popen() replaces several other tools (
os.system() is just one of those) that were scattered throughout three other Python modules.
If it helps, think of
subprocess.Popen() as a very flexible
subprocess.Popen() is strict super-set of
os.system is equivalent to Unix
system command, while
subprocess was a helper module created to provide many of the facilities provided by the
Popen commands with an easier and controllable interface. Those were designed similar to the Unix Popen command.
system()executes a command specified in command by calling
/bin/sh -c command, and returns after the command has been completed
popen()function opens a process by creating a pipe, forking, and
invoking the shell.
If you are thinking which one to use, then use
subprocess definitely because you have all the facilities for execution, plus additional control over the process.
Subprocess is based on popen2, and as such has a number of advantages – there’s a full list in the PEP here, but some are:
- using pipe in the shell
- better newline support
- better handling of exceptions
That said, an important piece of advice comes from os.system docs, which says:
The subprocess module provides more powerful facilities for spawning
new processes and retrieving their results; using that module is
preferable to using this function. See the Replacing Older Functions
with the subprocess Module section in the subprocess documentation for
some helpful recipes.