How to use the Subprocess Module in Python?

The subprocess module in Python allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This is the recommended way to execute system commands and interact with the operating system from Python programs.

Understanding Processes

When you execute a program, your Operating System creates a process. It uses system resources like CPU, RAM, and disk space. A process is isolated from other processes ? it can't see what other processes are doing or interfere with them.

Python's subprocess module provides a powerful interface for working with processes, allowing you to run system commands and capture their output.

Basic Process Information

You can access process data using the standard library os module ?

import os

print(f"Process ID: {os.getpid()}")
print(f"Current Working Directory: {os.getcwd()}")
Process ID: 12345
Current Working Directory: /home/user

Using subprocess.run()

The subprocess.run() function is the recommended way to run subprocesses. It waits for the command to complete and returns a CompletedProcess instance ?

import subprocess

# Run a simple command
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)

print("Return code:", result.returncode)
print("Output:", result.stdout)
Return code: 0
Output: Hello, World!

Using subprocess.Popen()

Popen provides more control over the subprocess execution. It's useful when you need to interact with the process while it's running ?

import subprocess

# Using Popen for more control
process = subprocess.Popen(['python', '-c', 'print("Python subprocess")'], 
                          stdout=subprocess.PIPE, 
                          stderr=subprocess.PIPE, 
                          text=True)

output, error = process.communicate()
print("Output:", output.strip())
print("Return code:", process.returncode)
Output: Python subprocess
Return code: 0

Capturing Command Output

You can capture and process the output of system commands. Here's an example that gets directory listing ?

import subprocess

# Get directory listing (works on Unix-like systems)
try:
    result = subprocess.run(['ls', '-la'], capture_output=True, text=True, check=True)
    lines = result.stdout.split('\n')
    
    print(f"Found {len(lines)} items:")
    for line in lines[:5]:  # Show first 5 lines
        if line.strip():
            print(line)
            
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")
except FileNotFoundError:
    print("Command not found (this example works on Unix-like systems)")

Error Handling

Always handle potential errors when working with subprocesses ?

import subprocess

try:
    # This command will fail
    result = subprocess.run(['python', '--invalid-option'], 
                          capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code: {e.returncode}")
    print(f"Error output: {e.stderr.strip()}")
except FileNotFoundError:
    print("Python executable not found")
Command failed with return code: 2
Error output: unknown option --invalid-option

Key Parameters

Parameter Description Usage
capture_output Capture stdout and stderr capture_output=True
text Return strings instead of bytes text=True
check Raise exception on non-zero exit check=True
shell Execute through the shell shell=True

Best Practices

When using subprocess, follow these guidelines ?

import subprocess
import shlex

# Good: Use list format for security
result = subprocess.run(['echo', 'safe input'], capture_output=True, text=True)

# When using shell=True, sanitize input
command = "echo 'processed input'"
result = subprocess.run(shlex.split(command), capture_output=True, text=True)

print("Safe output:", result.stdout.strip())
Safe output: safe input

Conclusion

The subprocess module is the standard way to execute system commands in Python. Use subprocess.run() for simple cases and Popen when you need more control. Always handle errors and sanitize inputs for security.

Updated on: 2026-03-25T11:52:43+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements