In all officially maintained versions of Python, the simplest approach is to use the subprocess.check_output function:

>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

check_output runs a single program that takes only arguments as input.1 It returns the result exactly as printed to stdout. If you need to write input to stdin, skip ahead to the run or Popen sections. If you want to execute complex shell commands, see the note on shell=True at the end of this answer.

The check_output function works in all officially maintained versions of Python. But for more recent versions, a more flexible approach is available.

Modern versions of Python (3.5 or higher): run

If you're using Python 3.5+, and do not need backwards compatibility, the new run function is recommended by the official documentation for most tasks. It provides a very general, high-level API for the subprocess module. To capture the output of a program, pass the subprocess.PIPE flag to the stdout keyword argument. Then access the stdout attribute of the returned CompletedProcess object:

>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

The return value is a bytes object, so if you want a proper string, you'll need to decode it. Assuming the called process returns a UTF-8-encoded string:

>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

This can all be compressed to a one-liner if desired:

>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

If you want to pass input to the process's stdin, you can pass a bytes object to the input keyword argument:

>>> cmd = ['awk', 'length($0) > 5']
>>> ip = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=ip)
>>> result.stdout.decode('utf-8')
'foofoo\n'

You can capture errors by passing stderr=subprocess.PIPE (capture to result.stderr) or stderr=subprocess.STDOUT (capture to result.stdout along with regular output). If you want run to throw an exception when the process returns a nonzero exit code, you can pass check=True. (Or you can check the returncode attribute of result above.) When security is not a concern, you can also run more complex shell commands by passing shell=True as described at the end of this answer.

Later versions of Python streamline the above further. In Python 3.7+, the above one-liner can be spelled like this:

>>> subprocess.run(['ls', '-l'], capture_output=True, text=True).stdout
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

Using run this way adds just a bit of complexity, compared to the old way of doing things. But now you can do almost anything you need to do with the run function alone.

Older versions of Python (3-3.4): more about check_output

If you are using an older version of Python, or need modest backwards compatibility, you can use the check_output function as briefly described above. It has been available since Python 2.7.

subprocess.check_output(*popenargs, **kwargs)  

It takes takes the same arguments as Popen (see below), and returns a string containing the program's output. The beginning of this answer has a more detailed usage example. In Python 3.5+, check_output is equivalent to executing run with check=True and stdout=PIPE, and returning just the stdout attribute.

You can pass stderr=subprocess.STDOUT to ensure that error messages are included in the returned output. When security is not a concern, you can also run more complex shell commands by passing shell=True as described at the end of this answer.

If you need to pipe from stderr or pass input to the process, check_output won't be up to the task. See the Popen examples below in that case.

Complex applications and legacy versions of Python (2.6 and below): Popen

If you need deep backwards compatibility, or if you need more sophisticated functionality than check_output or run provide, you'll have to work directly with Popen objects, which encapsulate the low-level API for subprocesses.

The Popen constructor accepts either a single command without arguments, or a list containing a command as its first item, followed by any number of arguments, each as a separate item in the list. shlex.split can help parse strings into appropriately formatted lists. Popen objects also accept a host of different arguments for process IO management and low-level configuration.

To send input and capture output, communicate is almost always the preferred method. As in:

output = subprocess.Popen(["mycmd", "myarg"], 
                          stdout=subprocess.PIPE).communicate()[0]

Or

>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, 
...                                    stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo

If you set stdin=PIPE, communicate also allows you to pass data to the process via stdin:

>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
...                           stderr=subprocess.PIPE,
...                           stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo

Note Aaron Hall's answer, which indicates that on some systems, you may need to set stdout, stderr, and stdin all to PIPE (or DEVNULL) to get communicate to work at all.

In some rare cases, you may need complex, real-time output capturing. Vartec's answer suggests a way forward, but methods other than communicate are prone to deadlocks if not used carefully.

As with all the above functions, when security is not a concern, you can run more complex shell commands by passing shell=True.

Notes

1. Running shell commands: the shell=True argument

Normally, each call to run, check_output, or the Popen constructor executes a single program. That means no fancy bash-style pipes. If you want to run complex shell commands, you can pass shell=True, which all three functions support. For example:

>>> subprocess.check_output('cat books/* | wc', shell=True, text=True)
' 1299377 17005208 101299376\n'

However, doing this raises security concerns. If you're doing anything more than light scripting, you might be better off calling each process separately, and passing the output from each as an input to the next, via

run(cmd, [stdout=etc...], input=other_output)

Or

Popen(cmd, [stdout=etc...]).communicate(other_output)

The temptation to directly connect pipes is strong; resist it. Otherwise, you'll likely see deadlocks or have to do hacky things like this.

Answer from senderle on Stack Overflow
Top answer
1 of 16
1971

In all officially maintained versions of Python, the simplest approach is to use the subprocess.check_output function:

>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

check_output runs a single program that takes only arguments as input.1 It returns the result exactly as printed to stdout. If you need to write input to stdin, skip ahead to the run or Popen sections. If you want to execute complex shell commands, see the note on shell=True at the end of this answer.

The check_output function works in all officially maintained versions of Python. But for more recent versions, a more flexible approach is available.

Modern versions of Python (3.5 or higher): run

If you're using Python 3.5+, and do not need backwards compatibility, the new run function is recommended by the official documentation for most tasks. It provides a very general, high-level API for the subprocess module. To capture the output of a program, pass the subprocess.PIPE flag to the stdout keyword argument. Then access the stdout attribute of the returned CompletedProcess object:

>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

The return value is a bytes object, so if you want a proper string, you'll need to decode it. Assuming the called process returns a UTF-8-encoded string:

>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

This can all be compressed to a one-liner if desired:

>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

If you want to pass input to the process's stdin, you can pass a bytes object to the input keyword argument:

>>> cmd = ['awk', 'length($0) > 5']
>>> ip = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=ip)
>>> result.stdout.decode('utf-8')
'foofoo\n'

You can capture errors by passing stderr=subprocess.PIPE (capture to result.stderr) or stderr=subprocess.STDOUT (capture to result.stdout along with regular output). If you want run to throw an exception when the process returns a nonzero exit code, you can pass check=True. (Or you can check the returncode attribute of result above.) When security is not a concern, you can also run more complex shell commands by passing shell=True as described at the end of this answer.

Later versions of Python streamline the above further. In Python 3.7+, the above one-liner can be spelled like this:

>>> subprocess.run(['ls', '-l'], capture_output=True, text=True).stdout
'total 0\n-rw-r--r--  1 memyself  staff  0 Mar 14 11:04 files\n'

Using run this way adds just a bit of complexity, compared to the old way of doing things. But now you can do almost anything you need to do with the run function alone.

Older versions of Python (3-3.4): more about check_output

If you are using an older version of Python, or need modest backwards compatibility, you can use the check_output function as briefly described above. It has been available since Python 2.7.

subprocess.check_output(*popenargs, **kwargs)  

It takes takes the same arguments as Popen (see below), and returns a string containing the program's output. The beginning of this answer has a more detailed usage example. In Python 3.5+, check_output is equivalent to executing run with check=True and stdout=PIPE, and returning just the stdout attribute.

You can pass stderr=subprocess.STDOUT to ensure that error messages are included in the returned output. When security is not a concern, you can also run more complex shell commands by passing shell=True as described at the end of this answer.

If you need to pipe from stderr or pass input to the process, check_output won't be up to the task. See the Popen examples below in that case.

Complex applications and legacy versions of Python (2.6 and below): Popen

If you need deep backwards compatibility, or if you need more sophisticated functionality than check_output or run provide, you'll have to work directly with Popen objects, which encapsulate the low-level API for subprocesses.

The Popen constructor accepts either a single command without arguments, or a list containing a command as its first item, followed by any number of arguments, each as a separate item in the list. shlex.split can help parse strings into appropriately formatted lists. Popen objects also accept a host of different arguments for process IO management and low-level configuration.

To send input and capture output, communicate is almost always the preferred method. As in:

output = subprocess.Popen(["mycmd", "myarg"], 
                          stdout=subprocess.PIPE).communicate()[0]

Or

>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, 
...                                    stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo

If you set stdin=PIPE, communicate also allows you to pass data to the process via stdin:

>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
...                           stderr=subprocess.PIPE,
...                           stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo

Note Aaron Hall's answer, which indicates that on some systems, you may need to set stdout, stderr, and stdin all to PIPE (or DEVNULL) to get communicate to work at all.

In some rare cases, you may need complex, real-time output capturing. Vartec's answer suggests a way forward, but methods other than communicate are prone to deadlocks if not used carefully.

As with all the above functions, when security is not a concern, you can run more complex shell commands by passing shell=True.

Notes

1. Running shell commands: the shell=True argument

Normally, each call to run, check_output, or the Popen constructor executes a single program. That means no fancy bash-style pipes. If you want to run complex shell commands, you can pass shell=True, which all three functions support. For example:

>>> subprocess.check_output('cat books/* | wc', shell=True, text=True)
' 1299377 17005208 101299376\n'

However, doing this raises security concerns. If you're doing anything more than light scripting, you might be better off calling each process separately, and passing the output from each as an input to the next, via

run(cmd, [stdout=etc...], input=other_output)

Or

Popen(cmd, [stdout=etc...]).communicate(other_output)

The temptation to directly connect pipes is strong; resist it. Otherwise, you'll likely see deadlocks or have to do hacky things like this.

2 of 16
208

This is way easier, but only works on Unix (including Cygwin) and Python2.7.

import commands
print commands.getstatusoutput('wc -l file')

It returns a tuple with the (return_value, output).

For a solution that works in both Python2 and Python3, use the subprocess module instead:

from subprocess import Popen, PIPE
output = Popen(["date"],stdout=PIPE)
response = output.communicate()
print response
🌐
Python
docs.python.org › 3 › library › subprocess.html
subprocess — Subprocess management
1 week ago - Return output (stdout and stderr) of executing cmd in a shell. Like getstatusoutput(), except the exit code is ignored and the return value is a string containing the command’s output.
Discussions

shell - In Python, get the output of system command as a string - Stack Overflow
In python I can run some system command using os or subprocess. The problem is that I can't get the output as a string. For example: >>> tmp = os.system("ls") file1 file2 >>... More on stackoverflow.com
🌐 stackoverflow.com
What's the best way to extract the standard output of a shell command?
http://docs.python.org/library/subprocess.html#subprocess.check_output More on reddit.com
🌐 r/Python
20
7
August 13, 2011
How to run remote shell commands and save the output to a variable
Assuming the client is Paramiko, the answers to this SO question explain that you have to do something extra to wait for the command to finish. More on reddit.com
🌐 r/learnpython
4
1
June 22, 2022
The Right Way to Run Shell Commands From Python
Well, there's a good list of modules to use above other alternatives pathlib, tempfile, and shutil you should always look at first before invoking subprocesses. However, later the articule has a few things that bug me. First, one should never mention shell=True without explaining the huge problems it can cause. By default, you shouldn't use shell=True unless you have an explicit explanation as to why it's a good idea, and why is it needed. Saying shlex.split is an alternative to that is also not good. Another insidious issue is... the examples are all... misleading. You should never invoke ls -la from a Python program. And much less pipe the output to awk. Precisely when you are explaining people to use pathlib and shutil! It may appear a minor point, but this is important. Python is a great replacement to using a traditional shell and text processing tools, and it leads to more robust and portable scripts... if you use it properly! I do agree that subprocess has missing batteries, and sh... is a clever thing, but I wouldn't recommend it. (What I miss in subprocess is having it some logging support, making check=True the default, and a few other quality of life improvements...) More on reddit.com
🌐 r/coding
5
12
June 5, 2023
🌐
Edureka Community
edureka.co › home › community › categories › python › running shell command and capturing the output
Running shell command and capturing the output | Edureka Community
December 28, 2020 - How to write a function that will execute a shell command and return its output as a string, no ... : 'Can't create database 'test'; database exists'
🌐
nixCraft
cyberciti.biz › nixcraft › howto › python › python run external command and get output on screen or in variable
Python Run External Command And Get Output On Screen or In Variable - nixCraft
March 28, 2023 - #!/usr/bin/python import subprocess, sys ## command to run - tcp only ## cmd = "/usr/sbin/netstat -p tcp -f inet" ## run it ## p = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) ## But do not wait till netstat finish, start displaying output immediately ## while True: out = p.stderr.read(1) if out == '' and p.poll() != None: break if out != '': sys.stdout.write(out) sys.stdout.flush()
🌐
iO Flood
ioflood.com › blog › python-run-shell-command
Using Python to Run Shell Commands
December 7, 2023 - This is not possible when passing the command as a list of strings, so we use shell=True to pass the command as a string instead. As we can see, the subprocess module is a powerful tool for running shell commands in Python.
🌐
Fedingo
fedingo.com › home › python run shell command & get output
Python Run Shell Command & Get Output - Fedingo
June 6, 2022 - As you can see the the result of shell command is stored in result object and can be displayed in stdout using the property of the same name. The above output is in byte format. If you want to convert it into string, use decode() command.
Find elsewhere
🌐
DigitalOcean
digitalocean.com › community › tutorials › python-system-command-os-subprocess-call
Python os.system() vs subprocess: Run System Commands | DigitalOcean
1 month ago - The capture_output=True parameter tells Python to collect both stdout and stderr. Setting text=True returns output as strings instead of raw bytes.
🌐
Roel Peters
roelpeters.be › home › python: execute shell commands (and get the output) with the os package
Python: execute shell commands (and get the output) with the os package — Roel Peters
November 11, 2021 - The most straightforward solution to running shell commands via Python is simply by using the system method of the os package. The os package “provides a portable way of using operating system dependent functionality.” The system method executes a string as a command in a subshell, which ...
🌐
W3docs
w3docs.com › python
Running shell command and capturing the output
In both cases, the output will be captured in the output variable, which you can then manipulate or print as desired.
🌐
Medium
medium.com › @anshulgarwal45 › how-to-store-the-output-of-a-command-using-python-f54b28ce256
How to Store the Output of a Command Using Python | by Anshul Garwal | Medium
July 1, 2023 - This function takes the command as its argument and also accepts additional parameters. In our case, we pass shell=True to enable shell execution and text=True to ensure that the output is returned as a string.
🌐
DataCamp
datacamp.com › tutorial › python-subprocess
An Introduction to Python Subprocess: Basics and Examples | DataCamp
September 12, 2025 - The check_output() function takes the same arguments as run(), including args (command to run) and optional arguments such as stdin, stderr, shell, cwd, and env. It returns the command's standard output as a bytes object or string (if text=True).
🌐
Quora
quora.com › What-is-a-convenient-way-to-execute-a-shell-command-in-Python-and-retrieve-its-output
What is a convenient way to execute a shell command in Python and retrieve its output? - Quora
This module is used to interact with the shell and only execute commands. So if yu create a string which contains the command to be executed, you can run it by importing os module and performing “os.run” ... On the other hand, if you actually want to get the output of an executed command so you can use it for various purposes, then you can use the subprocess module. os will only enable the execution of a command whereas subprocess runs the command as a subprocess of the operating system and can take in the input using getoutput functionality.
🌐
Medium
medium.com › @amarjeetaryan90 › python-command-output-capture-a-comprehensive-tutorial-on-storing-output-as-variables-c578cb900c2
Python Command Output Capture: A Comprehensive Tutorial on Storing Output as Variables | by Amarjeet Aryan | Medium
July 1, 2023 - Replace `”your-command”` with the actual command you want to run. Remember to set `shell=True` as an argument to enable command execution through the shell. Step 3: Decoding the Output The captured output is typically in bytes, so you’ll need to decode it into a string for further processing.
🌐
Janakiev
janakiev.com › blog › python-shell-commands
How to Execute Shell Commands with Python - njanakiev
April 22, 2019 - When you use the .read() function, you will get the whole output as one string. You can also use the .readlines() function, which splits each line (including a trailing \n). Note, that you can run them only once.
🌐
GeeksforGeeks
geeksforgeeks.org › python › print-output-from-os-system-in-python
Print Output from Os.System in Python - GeeksforGeeks
July 23, 2025 - Before using the os.system() function, you need to import the os module in your Python script. This module provides a way to interact with the operating system, including executing shell commands.
🌐
Python Forum
python-forum.io › thread-2392.html
[subprocess]>Run a cmd command and get output into a variable
Hello All, I'd like to run a windows cmd and get the result in a variable..it works well for a command but not for another... **confused** Here is : Command 'whoami' > Works !! **smile** [icode] import subprocess p1=subprocess.Popen(['whoami...
🌐
Medium
medium.com › @sumitdhattarwal4444 › how-to-store-the-output-of-a-command-in-a-variable-using-python-cd47fcd88845
How to store the output of a command in a variable using Python | by Sumit Dhattarwal | Medium
June 30, 2023 - In this example, the subprocess.run() function executes the specified command, and the capture_output=True argument captures the command's output. The text=True an argument ensures the output is returned as a string.