
subprocess 是 Python 用来创建和管理子进程的标准库,可以执行外部命令、调用其他程序,并获取它们的输入输出。
一、subprocess模块
Python 程序有时需要调用外部工具(如 ffmpeg、git、ls),subprocess 模块能:
-
执行系统命令
-
获取命令的输出和错误
-
向命令传递输入
-
控制命令的执行环境
二、subprocess 的核心方法
| 方法 | 说明 | 适用场景 |
|---|---|---|
subprocess.run() |
执行命令并等待完成,返回结果 | 推荐,简单场景 |
subprocess.Popen() |
创建子进程,更灵活的控制 | 需要精细控制 |
subprocess.call() |
执行命令,返回退出码 | 旧写法,不推荐 |
subprocess.check_output() |
执行命令,返回输出 | 旧写法,不推荐 |
新版 Python 推荐用 run(),复杂场景用 Popen()。
三、subprocess.run():最简单用法
import subprocess
# 执行命令,获取输出
result = subprocess.run(
["ls", "-l"], # 命令和参数(列表形式)
capture_output=True, # 捕获 stdout 和 stderr
text=True, # 输出为字符串
encoding="utf-8" # 编码
)
print(result.stdout) # 标准输出
print(result.stderr) # 标准错误
print(result.returncode) # 退出码,0 表示成功
常用参数:
| 参数 | 说明 |
|---|---|
args |
命令(列表或字符串) |
capture_output |
捕获 stdout 和 stderr |
text / encoding |
输出为字符串 |
shell=True |
用 shell 执行(慎用) |
cwd |
工作目录 |
timeout |
超时时间 |
check |
非零退出码时抛异常 |
env |
环境变量 |
四、subprocess.Popen():精细控制
Popen 是更底层的接口,不阻塞当前程序,适合需要实时读取输出、交互式操作、长时间运行的场景。
1. 参数说明
subprocess.Popen(
stdout=subprocess.PIPE, # 捕获标准输出
stderr=subprocess.STDOUT, # 标准错误合并到标准输出
errors="replace", # 遇到乱码时替换
text=True, # 输出为字符串,不是字节
encoding="utf-8", # 用 UTF-8 解码
bufsize=1 # 行缓冲
)
| 参数 | 说明 |
|---|---|
stdout=subprocess.PIPE |
标准输出通过管道捕获 |
stderr=subprocess.STDOUT |
标准错误重定向到标准输出 |
errors="replace" |
解码失败时用 ? 替换,不报错 |
text=True |
返回字符串而不是字节 |
encoding="utf-8" |
指定解码字符集 |
bufsize=1 |
行缓冲,每行输出一次 |
2. 使用示例
import subprocess
# 启动子进程
process = subprocess.Popen(
["ping", "-c", "4", "www.baidu.com"],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
encoding="utf-8",
bufsize=1
)
# 实时读取输出(逐行)
for line in process.stdout:
print(line, end="")
# 等待进程结束
process.wait()
print(f"退出码: {process.returncode}")
3. Popen 的常用方法
| 方法/属性 | 说明 |
|---|---|
process.stdout |
标准输出(可迭代) |
process.stdin |
标准输入(可写入) |
process.stderr |
标准错误 |
process.poll() |
检查是否结束,返回 None 或退出码 |
process.wait() |
等待进程结束 |
process.communicate() |
等待结束并返回 (stdout, stderr) |
process.terminate() |
终止进程 |
process.kill() |
强制杀死进程 |
process.returncode |
退出码 |