subprocess
subprocess 是 Python 标准库中的一个模块,用于创建和管理子进程。它允许你在 Python 程序中执行外部命令、调用其他程序,并与这些程序进行交互。subprocess 模块提供了丰富的功能,可以替代一些旧的模块和函数,如 os.system()、os.spawn*()、os.popen() 等。
主要功能
* 执行外部命令:subprocess 可以启动一个新的进程来执行外部命令。
* 与子进程交互:你可以通过 subprocess 与子进程的标准输入、输出和错误流进行交互。
* 获取命令的输出:你可以捕获子进程的输出,并在 Python 程序中使用。
* 控制子进程:你可以等待子进程完成、检查其返回码,甚至终止子进程。
常见函数
- subprocess.run():
这是subprocess模块中最常用的函数之一。它用于运行一个命令,并等待其完成,返回一个CompletedProcess对象,包含命令的执行结果。
- 核心参数
- args(必需参数)
类型:str 或 序列(如 list)
作用:指定要执行的命令 - shell
类型:bool
默认:Flase
作用:是否通过系统shell执行命令
注意:- Ture时可直接使用管道符等特性
- 存在安全风险(避免拼接用户输入)
- args(必需参数)
subprocess.run(["ls", "-l"]) # 推荐方式(安全)
subprocess.run("ls -l", shell=True) # 字符串形式需配合 shell=True
- 输入输出流控制
- stdout/stdin/stdeer
类型:文件描述符或subprocess.PIPE/DEVNULL
特殊值:- subprocess.PIPE # 捕获输出
- subprocess.DEVNULL # 丢弃输出
- subprocess.STDOUT # 将 stderr 合并到 stdout
- capture_output
类型:bool
默认:Flase
简写:stdout=subprocess.PIPE, stderr=subprocess.PIPE
* capture_output=True 等效于同时设置
stdout=subprocess.PIPE
stderr=subprocess.PIPE - text/universal_newlines
类型:bool
默认: Flase
作用:是否以字符串形式返回输出(默认返回字节)
- stdout/stdin/stdeer
- 执行控制
- check
类型:bool
默认:Flase
作用:当返回码非零时抛出CalledProcessError - timeout
类型:int/float
作用:设置命令超时时间(秒)
异常:触发TimeoutExpired - input
类型:bytes/str
作用:向子进程的标准输入发送数据
要求:需配合stdin=subprocess.PIEP
- check
- 环境控制
- cwd
类型:str/Path
作用:设置命令执行工作目录
示例:subprocess.run(["git", "status"], cwd="/project/path")
- env
类型:dict
作用:自定义环境变量
注意:默认继承当前环境,建议使用os.environ.copy()
- cwd
- subprocess.Popen():
- 核心定位
- 这是一个更底层的接口,提供了更多的灵活性。你可以使用它来启动一个子进程,并与其进行复杂的交互。subprocess.Popen 是 Python 子进程管理的底层接口,相比 subprocess.run() 提供更细粒度的控制,适用于以下场景:
- 实时流处理(如逐行读取日志)
- 交互式命令(如自动化 SSH 会话)
- 后台进程管理(如启动守护进程)
- 复杂 I/O 管道(如多进程协作)
- 这是一个更底层的接口,提供了更多的灵活性。你可以使用它来启动一个子进程,并与其进行复杂的交互。subprocess.Popen 是 Python 子进程管理的底层接口,相比 subprocess.run() 提供更细粒度的控制,适用于以下场景:
- subprocess.call():
- 功能概述
作用:执行命令并等待其完成,返回命令的 退出状态码(0 表示成功,非 0 表示失败)13。
典型场景:简单执行命令且不关心输出内容,只需判断是否成功。
核心参数- 核心参数
- args
类型/默认值:str 或 list
说明:要执行的命令(推荐列表形式)示例:call(["ls", "-l"]) 或 call("ls -l", shell=True)
- shell
类型/默认值:bool (False)
说明:是否通过系统 shell 执行(支持管道符等特性,但有安全风险) - stdout
类型/默认值:文件描述符
说明:控制标准输出(默认输出到终端,可用 subprocess.DEVNULL 丢弃输出) - stderr
类型/默认值:文件描述符
说明:控制标准错误(默认输出到终端)
- args
- 核心参数
import subprocess
# 执行命令并检查状态码
return_code = subprocess.call(["gcc", "main.c"])
if return_code == 0:
print("编译成功")
else:
print("编译失败,错误码:", return_code)
- subprocess.check_output():
- 功能概述
作用:执行命令并 捕获标准输出内容(不捕获错误输出),若命令失败则抛出 CalledProcessError 异常
典型场景:需要获取命令输出内容,且要求命令必须成功执行。 - 核心参数
- args
类型/默认值:str 或 list
说明:同 call() - shell
类型/默认值:bool (False)
说明:同 call() - stdeer
类型/默认值:文件描述符
说明:默认错误输出到终端,可设为 subprocess.STDOUT 合并到 stdout - universal_newlines
类型/默认值:bool (False)
说明:返回字符串形式 - encoding
类型:str
说明:指定输出编码(需配合 text=True 使用)
- args
- 功能概述
import subprocess
try:
output = subprocess.check_output(
["python", "script.py"],
stderr=subprocess.STDOUT, # 合并错误到输出
text=True # 返回字符串而非字节
)
print("输出结果:", output)
except subprocess.CalledProcessError as e:
print("执行失败,错误信息:", e.output)