- See Full List On Python.org
- Code Runner Python 3
- Python Code Runner Download
- Docs.python.org › 3 › Using3. Using Python On Windows — Python 3.9.7 Documentation
The 3.8 MSI installer for Windows will not let you install another 3.8 version of Python. If setup-python fails for a 3.8 version of Python, make sure any previously installed versions are removed by going to 'Apps & Features' in the Settings app. How to install the Python 3 system (which includes the IDLE environment) and run a simple Python 3 programSee example programs written in Python 3 here:http.
Tutorial
The author selected the COVID-19 Relief Fund to receive a donation as part of the Write for DOnations program.
Introduction
Python 3 includes the subprocess
module for running external programs and reading their outputs in your Python code.
You might find subprocess
useful if you want to use another program on your computer from within your Python code. For example, you might want to invoke git
from within your Python code to retrieve files in your project that are tracked in git
version control. Since any program you can access on your computer can be controlled by subprocess
, the examples shown here will be applicable to any external program you might want to invoke from your Python code.
subprocess
includes several classes and functions, but in this tutorial we’ll cover one of subprocess
’s most useful functions: subprocess.run
. We’ll review its different uses and main keyword arguments.
Prerequisites
To get the most out of this tutorial, it is recommended to have some familiarity with programming in Python 3. You can review these tutorials for the necessary background information:
Running an External Program
You can use the subprocess.run
function to run an external program from your Python code. First, though, you need to import the subprocess
and sys
modules into your program:
If you run this, you will receive output like the following:
Let’s review this example:
sys.executable
is the absolute path to the Python executable that your program was originally invoked with. For example,sys.executable
might be a path like/usr/local/bin/python
.subprocess.run
is given a list of strings consisting of the components of the command we are trying to run. Since the first string we pass issys.executable
, we are instructingsubprocess.run
to execute a new Python program.- The
-c
component is apython
command line option that allows you to pass a string with an entire Python program to execute. In our case, we pass a program that prints the stringocean
.
You can think of each entry in the list that we pass to subprocess.run
as being separated by a space. For example, [sys.executable, '-c', 'print('ocean')']
translates roughly to /usr/local/bin/python -c 'print('ocean')'
. Note that subprocess
automatically quotes the components of the command before trying to run them on the underlying operating system so that, for example, you can pass a filename that has spaces in it.
Warning: Never pass untrusted input to subprocess.run
. Since subprocess.run
has the ability to perform arbitrary commands on your computer, malicious actors can use it to manipulate your computer in unexpected ways.
Capturing Output From an External Program
See Full List On Python.org
Now that we can invoke an external program using subprocess.run
, let’s see how we can capture output from that program. For example, this process could be useful if we wanted to use git ls-files
to output all your files currently stored under version control.
Note: The examples shown in this section require Python 3.7 or higher. In particular, the capture_output
and text
keyword arguments were added in Python 3.7 when it was released in June 2018.
Let’s add to our previous example:
If we run this code, we’ll receive output like the following:
This example is largely the same as the one introduced in the first section: we are still running a subprocess to print ocean
. Importantly, however, we pass the capture_output=True
and text=True
keyword arguments to subprocess.run
.
subprocess.run
returns a subprocess.CompletedProcess
object that is bound to result
. The subprocess.CompletedProcess
object includes details about the external program’s exit code and its output. capture_output=True
ensures that result.stdout
and result.stderr
are filled in with the corresponding output from the external program. By default, result.stdout
and result.stderr
are bound as bytes, but the text=True
keyword argument instructs Python to instead decode the bytes into strings.
In the output section, stdout
is ocean
(plus the trailing newline that print
adds implicitly), and we have no stderr
.
Let’s try an example that produces a non-empty value for stderr
:
If we run this code, we receive output like the following:
This code runs a Python subprocess that immediately raises a ValueError
. When we inspect the final result
, we see nothing in stdout
and a Traceback
of our ValueError
in stderr
. This is because by default Python writes the Traceback
of the unhandled exception to stderr
.
Raising an Exception on a Bad Exit Code
Sometimes it’s useful to raise an exception if a program we run exits with a bad exit code. Programs that exit with a zero code are considered successful, but programs that exit with a non-zero code are considered to have encountered an error. As an example, this pattern could be useful if we wanted to raise an exception in the event that we run git ls-files
in a directory that wasn’t actually a git
repository.
We can use the check=True
keyword argument to subprocess.run
to have an exception raised if the external program returns a non-zero exit code:
If we run this code, we receive output like the following:
This output shows that we ran a subprocess that raised an error, which is printed in stderr
in our terminal. Then subprocess.run
dutifully raised a subprocess.CalledProcessError
on our behalf in our main Python program.
Alternatively, the subprocess
module also includes the subprocess.CompletedProcess.check_returncode
method, which we can invoke for similar effect:
If we run this code, we’ll receive:
Since we didn’t pass check=True
to subprocess.run
, we successfully bound a subprocess.CompletedProcess
instance to result
even though our program exited with a non-zero code. Calling result.check_returncode()
, however, raises a subprocess.CalledProcessError
because it detects the completed process exited with a bad code.
Using timeout to Exit Programs Early
Code Runner Python 3
subprocess.run
includes the timeout
argument to allow you to stop an external program if it is taking too long to execute:
If we run this code, we’ll receive output like the following:
The subprocess we tried to run used the time.sleep
function to sleep for 2
seconds. However, we passed the timeout=1
keyword argument to subprocess.run
to time out our subprocess after 1
second. This explains why our call to subprocess.run
ultimately raised a subprocess.TimeoutExpired
exception.
Note that the timeout
keyword argument to subprocess.run
is approximate. Python will make a best effort to kill the subprocess after the timeout
number of seconds, but it won’t necessarily be exact.
Python Code Runner Download
Passing Input to Programs
Sometimes programs expect input to be passed to them via stdin
.
The input
keyword argument to subprocess.run
allows you to pass data to the stdin
of the subprocess. For example:
We’ll receive output like the following after running this code:
In this case, we passed the bytes underwater
to input
. Our target subprocess used sys.stdin
to read the passed in stdin
(underwater
) and printed it out in our output.
The input
keyword argument can be useful if you want to chain multiple subprocess.run
calls together passing the output of one program as the input to another.
Conclusion
The subprocess
module is a powerful part of the Python standard library that lets you run external programs and inspect their outputs easily. In this tutorial, you have learned to use subprocess.run
to control external programs, pass input to them, parse their output, and check their return codes.
Docs.python.org › 3 › Using3. Using Python On Windows — Python 3.9.7 Documentation
The subprocess
module exposes additional classes and utilities that we did not cover in this tutorial. Now that you have a baseline, you can use the subprocess
module’s documentation to learn more about other available classes and utilities.