Difference between subprocess.Popen and os.system

138,008

Solution 1

If you check out the subprocess section of the Python docs, you'll notice there is an example of how to replace os.system() with subprocess.Popen():

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 os.system().

Solution 2

subprocess.Popen() is strict super-set of os.system().

Solution 3

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

Whereas:

The 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.

Solution 4

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

Solution 5

When running python (cpython) on windows the <built-in function system> os.system will execute under the curtains _wsystem while if you're using a non-windows os, it'll use system.

On contrary, Popen should use CreateProcess on windows and _posixsubprocess.fork_exec in posix-based operating-systems.

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.

Share:
138,008

Related videos on Youtube

Arovit
Author by

Arovit

Python Enthusiastic. Loves to Code.

Updated on July 23, 2020

Comments

  • Arovit
    Arovit almost 4 years

    What is the difference between subprocess.Popen() and os.system()?

  • Sven Marnach
    Sven Marnach over 13 years
    You can also use sts = p.wait() instead of the last line.
  • Arovit
    Arovit over 13 years
    okay..then is there any way i can execute both os.system and popen in windows env ? i am a newbie and need to dig deeper..
  • Senthil Kumaran
    Senthil Kumaran over 13 years
    Yes, you can use both os.system and subprocess in Windows Environment. Have a look at basic tutorials from effbot.org (Python Standard Library online book)
  • praxmon
    praxmon over 9 years
    @JacobMarble so suppose I am calling a selenium scraping script from another python script, which of these would allow me to complete the scraping script and then and only then execute the next line of code? As in, my scraping should complete before the execution can continue.
  • Farshid Ashouri
    Farshid Ashouri over 8 years
    This is the complete elegant answer.
  • tripleee
    tripleee over 7 years
    Maybe also mention stackoverflow.com/questions/3172470/… to point out that you ought to avoid the shell=True if you can. Having this option is one of the benefits of subprocess.Popen() and its helper functions.
  • Amir Hossein Baghernezad
    Amir Hossein Baghernezad almost 7 years
    @PrakharMohanSrivastava If you want to block the flow and wait for command to complete its work check out: stackoverflow.com/a/2837319/5252192
  • alpha_989
    alpha_989 over 6 years
    @PrakharMohanSrivastava, in general both os.system and subprocess.call/popen/run does block/wait for the command to finish: stackoverflow.com/a/14059648/4752883
  • naught101
    naught101 over 3 years
    It's elegant, but it's not complete, because it doesn't describe what os.system is missing, or why you might need Popen.
  • Admin
    Admin over 2 years
    (small fact) In 2022 if you take the same documentation, sts = os.system("mycmd" + " myarg") becomes now retcode = call("mycmd" + " myarg", shell=True)