225

I want to call an external program from Python. I have used both Popen() and call() to do that.

What's the difference between the two?

My specific goal is to run the following command from Python. I am not sure how redirects work.

./my_script.sh > output

I read the documentation and it says that call() is a convenience function or a shortcut function. Do we lose any power by using call() instead of Popen()?

nbro
  • 15,395
  • 32
  • 113
  • 196
varunl
  • 19,499
  • 5
  • 29
  • 47
  • What part of the documentation confused you? The definition of `call()` seems to be very clear. Can you provide a quote or a link so we know what to focus on in an answer? – S.Lott Oct 06 '11 at 23:48

2 Answers2

318

There are two ways to do the redirect. Both apply to either subprocess.Popen or subprocess.call.

  1. Set the keyword argument shell = True or executable = /path/to/the/shell and specify the command just as you have it there.

  2. Since you're just redirecting the output to a file, set the keyword argument

    stdout = an_open_writeable_file_object
    

    where the object points to the output file.

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.

agf
  • 171,228
  • 44
  • 289
  • 238
  • 27
    Basically Popen and call are asynchronous and Synchronous functions respectively used run Linux commands. – user3016020 Dec 13 '15 at 20:19
  • 2
    What's the advantage of using popen? Wouldn't it be safe to wait till the called program finishes first? – Tom Jun 29 '16 at 00:07
  • 4
    @Tom Often not. What if you want to read some output, then send more input to the program, read more output that results from that input, repeat? – agf Jun 29 '16 at 06:11
  • 1
    @user3016020 I assume this also applies to Windows commands? Right? – domih Jun 06 '17 at 07:54
  • 1
    @user3016020 I do not get your phrase, could you elaborate? used run Linux commands.. – Timo Dec 31 '20 at 20:13
  • 1
    I thought that popen has an iterable as argument whereas call a string. – Timo Dec 31 '20 at 20:13
60

The other answer is very complete, but here is a rule of thumb:

  • call is blocking:

    call('notepad.exe')
    print('hello')  # only executed when notepad is closed
    
  • Popen is non-blocking:

    Popen('notepad.exe')
    print('hello')  # immediately executed
    
Basj
  • 41,386
  • 99
  • 383
  • 673