Python 中subprocess 模块:执行外部命令

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 退出码
相关推荐
懂点Tech2 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
爱上纯净的蓝天6 小时前
不用云做 RAG:一个本地笔记问答工具的取舍与坑
python·开源·大模型·rag·本地部署
cspttty7 小时前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
用户8356290780517 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123457 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
严谨的麻辣烫7 小时前
Python HTTP 连接池怎么用?从连接复用到请求异常排查
开发语言·python·http·requests·网络排查
摇滚侠7 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
用户8356290780517 小时前
如何使用 Python 在 Word 文档中创建和格式化列表
后端·python
GIoT80107 小时前
网络出口如何选择?固定 IP 与 IP 轮换的原理及实践
python