The subprocess
module in Python allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. It is used for executing system commands and handling their output and errors.
Table of Contents
- Introduction
- Key Functions and Classes
run
Popen
call
check_call
check_output
- Examples
- Running a Simple Command
- Capturing Command Output
- Handling Command Errors
- Running a Command with a Timeout
- Using
Popen
for Advanced Use Cases
- Real-World Use Case
- Conclusion
- References
Introduction
The subprocess
module provides a higher-level interface to interact with and manage system processes. It can replace older modules and functions like os.system
, os.spawn*
, and os.popen*
by providing more powerful capabilities.
Key Functions and Classes
run
Runs a command, waits for it to complete, and returns a CompletedProcess
instance.
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
Popen
A more flexible class for process creation and management.
import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print(stdout.decode())
call
Runs a command and returns the return code.
import subprocess
return_code = subprocess.call(['ls', '-l'])
print(f'Return code: {return_code}')
check_call
Runs a command and checks that it executed successfully. Raises a CalledProcessError
if the command returns a non-zero exit code.
import subprocess
try:
subprocess.check_call(['ls', '-l'])
print('Command executed successfully')
except subprocess.CalledProcessError as e:
print(f'Command failed with return code {e.returncode}')
check_output
Runs a command and returns its output. Raises a CalledProcessError
if the command returns a non-zero exit code.
import subprocess
try:
output = subprocess.check_output(['ls', '-l'], text=True)
print(output)
except subprocess.CalledProcessError as e:
print(f'Command failed with return code {e.returncode}')
Examples
Running a Simple Command
import subprocess
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print(result.stdout)
Output:
Hello, World!
Capturing Command Output
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
Output:
(total 4
-rw-r--r-- 1 user group 1234 Jul 26 12:00 example.txt)
Handling Command Errors
import subprocess
try:
result = subprocess.run(['ls', '/nonexistent'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
print(f'Error: {e.stderr}')
Output:
Error: ls: cannot access '/nonexistent': No such file or directory
Running a Command with a Timeout
import subprocess
try:
result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
print('Command timed out')
Output:
Command timed out
Using Popen for Advanced Use Cases
import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print(stdout.decode())
Output:
(total 4
-rw-r--r-- 1 user group 1234 Jul 26 12:00 example.txt)
Real-World Use Case
Automating System Administration Tasks
You can use the subprocess
module to automate various system administration tasks, such as managing files, monitoring system performance, and deploying applications.
import subprocess
def check_disk_usage():
result = subprocess.run(['df', '-h'], capture_output=True, text=True)
return result.stdout
def restart_service(service_name):
try:
subprocess.check_call(['sudo', 'systemctl', 'restart', service_name])
print(f'Service {service_name} restarted successfully')
except subprocess.CalledProcessError as e:
print(f'Failed to restart service {service_name} with return code {e.returncode}')
if __name__ == '__main__':
print('Disk Usage:')
print(check_disk_usage())
restart_service('apache2')
Output:
Disk Usage:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 18G 63% /
...
Service apache2 restarted successfully
Conclusion
The subprocess
module in Python is used for interacting with and managing system processes. It provides a flexible and comprehensive API for running commands, capturing output, handling errors, and more. This module is essential for automating system tasks and integrating external programs into Python applications.
Comments
Post a Comment
Leave Comment