subprocess 是 Python 标准库中用于管理外部进程的模块,提供了强大的接口来创建子进程、连接它们的输入输出、获取执行结果等。它是对早期 os.system、os.spawn*、popen* 等模块的替代,推荐在所有子进程调用场景中使用。
常见应用场景:
(1)在 Python 中调用系统命令或脚本(如 ping、ls、ffmpeg 等)。
(2)捕获外部命令输出。
(3)构建自动化工具、脚本、测试框架。
(4)控制多个系统进程或实现进程间通信。
(5)结合其他命令行工具(如 Git、SSH、编译器等)完成开发或部署流程。
◆ ◆ ◆
核心概念
1、子进程(Subprocess)
指由当前 Python 脚本启动的外部系统进程,比如执行一个 shell 命令、运行另一个程序等。
2、Popen 类
subprocess 的核心类,用于启动子进程,并提供对其输入、输出、错误及退出状态的控制。
3、简化函数
如 run()、call()、check_output() 等是对 Popen 的封装,便于快速使用。
4、参数 stdout、stderr、stdin
用于控制子进程的输入输出流,可用于数据交互、重定向或捕获信息。
◆ ◆ ◆
应用举例
例 1:执行简单命令并输出结果
import subprocess
result = subprocess.run("echo Hello, world!", capture_output=True, text=True, shell=True)print("命令输出:", result.stdout.strip())
例 2:列出当前目录下所有文件(适配 Windows)
import subprocess
result = subprocess.run("dir", capture_output=True, text=True, shell=True)print("当前目录内容:")print(result.stdout)
例 3:调用外部可执行程序(如 Notepad)
import subprocess
# 启动记事本(非阻塞)subprocess.Popen("notepad.exe", shell=True)
例 4:与外部命令交互(传递输入)
import subprocess
# 使用 findstr 搜索关键字(Windows 中的 grep 替代)proc = subprocess.run("findstr Hello", input="Hello\nWorld\n", capture_output=True, text=True, shell=True)print("搜索结果:", proc.stdout.strip())
例 5:捕获错误输出
import subprocess
# 执行一个无效命令result = subprocess.run("wrong_command", capture_output=True, text=True, shell=True)
print("标准输出:", result.stdout)print("错误输出:", result.stderr)print("返回码:", result.returncode)
◆ ◆ ◆
常用函数速览
subprocess.DEVNULL
表示一个特殊的文件对象,指向操作系统的空设备(如 Windows 的 NUL)。用于丢弃输入/输出。
subprocess.PIPE
用于捕获子进程的标准输入、标准输出或标准错误。
subprocess.call(args, **kwargs)
执行命令并等待返回,返回退出码。
参数:
args:命令及参数的列表或字符串
kwargs:其他控制参数,如 cwd, timeout, shell
返回:整数类型,子进程的返回码(0 表示成功)
subprocess.check_call(args, **kwargs)
执行命令,若返回码不为 0,则抛出异常。
参数:同 call()
返回:成功时返回 0,否则抛出 CalledProcessError
subprocess.check_output(args, **kwargs)
执行命令并返回其输出(标准输出)。
参数:
args:命令参数
text=True:返回字符串而非字节串
返回:字符串或字节串(取决于参数设置)
subprocess.Popen(args, **kwargs)
启动子进程并返回 Popen 对象,可进行更细致的控制。
参数:
args:命令及参数
stdin, stdout, stderr:输入输出重定向
返回:Popen 实例对象
subprocess.run(args, **kwargs)
执行命令,等待其完成,返回 CompletedProcess 对象(推荐用法)。
参数:
args:命令及参数
capture_output=True:捕获 stdout 和 stderr
text=True:将输出转为字符串
check=True:自动抛出错误
Shell=Ture:可兼容 Windows 内置命令
返回:CompletedProcess 对象,包含 args、returncode、stdout、stderr 等属性
◆ ◆ ◆
补充说明
1、若使用 shell=True,建议传入字符串(而非列表),以避免命令解释错误。
Windows 系统的许多常见命令(如 dir、echo、findstr)并非独立可执行文件,而是内部命令,需通过 cmd.exe 执行,所以需设置 shell=True。
2、若需跨平台兼容,请使用 shutil.which() 检查命令是否存在,或基于平台动态修改命令。
3、Popen 是高级接口,适用于需要流式读取、进程通信、并发管理等场景。
4、若目标是后台任务管理或进程池,推荐结合 multiprocessing 或 concurrent.futures 使用。
“点赞有美意,赞赏是鼓励”