subprocess模块:Python调用系统命令全攻略
Python调用系统命令全攻略:subprocess模块深度解析
在Python编程中,我们常常需要与操作系统进行交互,调用系统命令来完成各种任务,比如执行文件操作、运行脚本等。Python的subprocess模块就是实现这一功能的强大工具。本文将详细介绍subprocess模块的使用方法,帮助你全面掌握Python调用系统命令的技巧。
1. subprocess模块简介
subprocess模块允许你生成新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。它提供了一个高级接口,用于替代一些旧的模块和函数,如os.system、os.spawn*等。
2. 基本使用:subprocess.run()
subprocess.run()是Python 3.5及以上版本中推荐使用的函数,用于执行系统命令。下面是一个简单的示例:

import subprocess
# 执行系统命令 'ls -l'
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# 打印命令的标准输出
print(result.stdout)
# 打印命令的返回码
print(f"返回码: {result.returncode}")
在上述代码中,subprocess.run()接受一个命令列表作为参数,capture_output=True表示捕获命令的标准输出和标准错误,text=True表示以文本模式处理输出。
3. 执行简单命令:subprocess.call()
subprocess.call()是一个较旧的函数,用于执行系统命令并返回命令的返回码。示例如下:
import subprocess
# 执行系统命令 'pwd'
returncode = subprocess.call(['pwd'])
print(f"返回码: {returncode}")
subprocess.call()执行命令后直接返回命令的返回码,不捕获命令的输出。
4. 执行复杂命令:subprocess.Popen()
subprocess.Popen()是subprocess模块中最底层的函数,提供了更多的控制选项。下面是一个使用Popen执行命令并获取输出的示例:
import subprocess
# 创建一个Popen对象
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, text=True)
# 获取命令的标准输出
stdout, stderr = process.communicate()
# 打印标准输出
print(stdout)
# 打印返回码
print(f"返回码: {process.returncode}")
Popen对象的communicate()方法用于与子进程进行交互,获取命令的输出和错误信息。
5. 处理命令的输入和输出
有时候,我们需要向命令传递输入,并处理命令的输出。下面是一个示例:
import subprocess
# 执行命令 'grep' 并传递输入
process = subprocess.Popen(['grep', 'hello'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
# 向命令传递输入
input_text = 'hello world\nbye world'
stdout, stderr = process.communicate(input=input_text)
# 打印输出
print(stdout)
在这个示例中,我们使用Popen对象的communicate()方法向grep命令传递输入,并获取命令的输出。
6. 异常处理
在调用系统命令时,可能会出现各种异常,如命令不存在、权限不足等。我们可以使用try-except语句来捕获并处理这些异常。示例如下:
import subprocess
try:
# 执行一个不存在的命令
subprocess.run(['nonexistent_command'], check=True)
except subprocess.CalledProcessError as e:
print(f"命令执行失败: {e}")
except FileNotFoundError:
print("命令未找到")
check=True表示如果命令返回非零退出状态码,则抛出CalledProcessError异常。
总结与建议
subprocess模块为Python开发者提供了强大而灵活的系统命令调用功能。在使用时,我们可以根据具体需求选择合适的函数:
- 对于简单的命令执行,推荐使用
subprocess.run()。 - 如果只需要获取命令的返回码,可以使用
subprocess.call()。 - 对于复杂的命令执行和交互,
subprocess.Popen()是更好的选择。 同时,在调用系统命令时,一定要注意异常处理,确保程序的健壮性。通过合理使用subprocess模块,你可以轻松实现Python与操作系统的交互,完成各种复杂的任务。

