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 退出码
相关推荐
刘马想放假9 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
2601_9679873710 小时前
python判断变量名不要调用任何函数实现
python·函数·语法·判断·变量名
卷无止境11 小时前
SALib敏感性分析的python库学习笔记
后端·python
duansamve12 小时前
Python3+Flask+PostgreSQL18+Vue3项目生产环境用docker如何部署?
python·docker·flask
特立独行的猫A12 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
特立独行的猫A13 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
duansamve13 小时前
详解Flask中Session和Cookie
python·flask
威哥爱编程14 小时前
模拟面试智能体开发实战 04:面试聊到哪算哪?用状态机把整场面试编排起来
python·agent·harmonyos
威哥爱编程14 小时前
模拟面试智能体开发实战 03:AI 面试官太客气?人设 Prompt 让它像个真考官
python·agent·harmonyos
量化分析码农14 小时前
股票数据接口返回字段逐项解析:从在线验证到 Python 数据校验
python