The question is published on by Tutorial Guruji team.
I want to call an external program from Python. I have used both
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
There are two ways to do the redirect. Both apply to either
Set the keyword argument
shell = Trueor
executable = /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_object
where the object points to the
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
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