详细介绍一下subprocess是个什么库?
2025-08-16 21:37:09 2 分享链接 开发笔记 python
subprocess
是 Python 标准库中用于创建新进程、连接到它们的输入/输出/错误管道,并获取它们的返回码的模块。它提供了一种灵活的方式来在 Python 程序中执行外部命令(如 ffmpeg
、ls
、cmd
等),是替代旧有模块(如 os.system
、os.popen
)的推荐方案。
核心功能
subprocess
的主要作用是让 Python 程序与外部命令/程序进行交互,具体包括:
- 执行外部命令(如调用
ffmpeg
处理视频、git
执行版本控制等)。 - 获取命令的输出结果(stdout)、错误信息(stderr)。
- 向外部命令传递输入(stdin)。
- 控制命令的执行环境(如工作目录、环境变量)。
- 等待命令执行完成并获取返回码(判断命令是否成功执行)。
常用函数
subprocess
模块提供了多个函数,其中最常用的有:
1. subprocess.run()
(推荐)
Python 3.5+ 新增,是执行命令的主要函数,封装了其他低级函数的功能,返回一个 CompletedProcess
对象(包含命令执行结果)。
基本用法:
import subprocess
# 执行简单命令(如查看当前目录)
result = subprocess.run(['ls', '-l'], # 命令及其参数(列表形式推荐,避免空格问题)
stdout=subprocess.PIPE, # 捕获标准输出
stderr=subprocess.PIPE, # 捕获标准错误
text=True) # 输出以字符串形式返回(默认是字节流)
# 查看结果
print("返回码:", result.returncode) # 0 表示成功,非0表示失败
print("标准输出:", result.stdout)
print("标准错误:", result.stderr)
关键参数:
args
:要执行的命令(可以是字符串或列表,推荐列表形式,避免解析问题)。stdout/stderr
:控制输出的处理方式:subprocess.PIPE
:捕获输出到result.stdout
/result.stderr
。subprocess.DEVNULL
:忽略输出。subprocess.STDOUT
:将 stderr 合并到 stdout。
text
(或universal_newlines
):设为True
时,输出为字符串(否则为字节流)。check
:设为True
时,若命令返回非0状态码,会抛出CalledProcessError
异常(常用于确保命令必须成功执行的场景)。cwd
:指定命令执行的工作目录。env
:指定环境变量(默认继承当前进程的环境变量)。
2. 其他函数(了解即可)
subprocess.call()
:类似run()
,但只返回命令的返回码(不捕获输出)。subprocess.check_call()
:类似call()
,但命令失败时会抛出异常(等价于run(..., check=True)
)。subprocess.check_output()
:专门用于获取命令输出,命令失败时抛出异常(等价于run(..., check=True, stdout=PIPE).stdout
)。
在视频处理脚本中的应用
在之前的视频处理脚本中,subprocess.run()
主要用于:
- 调用
ffmpeg -encoders
检测系统支持的编码器(判断硬件编码能力)。 - 调用
ffmpeg
命令处理视频(应用滤镜、编码转换等)。
例如,执行 ffmpeg
处理视频的核心代码:
# 构建ffmpeg命令(列表形式)
ffmpeg_cmd = [
'ffmpeg', '-i', input_path, # 输入文件
'-vf', vf_filter, # 应用滤镜
'-r', '60', # 帧率
output_path # 输出文件
]
# 执行命令并捕获结果
result = subprocess.run(
ffmpeg_cmd,
check=True, # 命令失败时抛出异常
stdout=subprocess.PIPE, # 捕获输出
stderr=subprocess.PIPE, # 捕获错误
text=True # 输出为字符串
)
为什么用 subprocess
而不是 os.system
?
- 安全性:
os.system
会直接将命令字符串传递给shell解析,存在注入风险(如命令包含; rm -rf /
等恶意代码);而subprocess
推荐使用列表形式传递命令,避免解析问题。 - 灵活性:
subprocess
可以精细控制输入/输出、超时时间、环境变量等,而os.system
功能简单,无法捕获输出。 - 可读性:
subprocess.run()
的参数更明确,代码意图更清晰。
总结
subprocess
是 Python 中执行外部命令的核心模块,尤其适合需要与系统工具(如 ffmpeg
、git
、bash
等)交互的场景。其设计灵活且安全,run()
函数是大多数情况下的首选,通过控制参数可以满足各种命令执行需求。
最近更新
- 2025-08-16 21:37
- 详细介绍一下subprocess是个什么库?
- 2025-08-14 18:43
- Windows 环境下隐藏subprocess命令行窗口的补丁技术详解
- 2025-08-12 23:48
- 介绍一下Github上自动化视频剪辑(如根据音频 / 字幕匹配视频片段)有哪些项目
- 2025-08-12 23:34
- 在 FFmpeg 中 通过 concat 合并多个文件时里要注意时间基与像素格式
- 2025-08-12 00:22
- 优化豆包智能分镜、分段的提示词与智能体2025.08.12
- 2025-08-04 16:13
- 详细介绍一下 tkinter 的pack布局参数
- 2025-08-03 17:50
- pyinstaller --onefile --windowed 与 pyinstaller -F -w的区别
- 2025-08-03 17:39
- 使用 PyInstaller 打包 Python 程序时 隐藏调用其它程序的命令窗口。
- 2025-08-03 11:04
- 使用 PyInstaller 打包 Python 程序时 -F 与 -D的区别。
- 2025-08-01 15:15
- 通过Edge-tts生成的中文字幕如何自然断句?