Python 的
subprocess 模块用于创建新进程、连接到它们的输入 / 输出 / 错误管道,并获取它们的返回码。它是 Python 中替代
os.system()、
os.popen() 等旧有进程管理函数的推荐方式,提供了更强大、更灵活的进程控制能力。
subprocess 模块的核心是创建子进程,主要通过以下函数实现:
Python 3.5+ 新增的推荐函数,封装了大多数常见场景,返回一个 CompletedProcess 对象(包含进程执行结果)。
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, ...):类似 run(),但仅返回子进程的返回码(不捕获输出,除非指定 stdout=PIPE)。
subprocess.check_call(args, ...):等价于 run(args, check=True),返回码非 0 时抛出异常。
subprocess.check_output(args, ...):等价于 run(args, check=True, stdout=PIPE),返回子进程的 stdout 输出(字符串或字节流)。
- 安全风险:
shell=True 时,若 args 包含用户输入,可能导致命令注入攻击(例如 args = f"ls {user_input}",若用户输入 ; rm -rf / 会执行危险命令)。尽量使用列表形式的 args 并避免 shell=True。
- 编码问题:若不指定
encoding,stdout/stderr 为字节流(bytes),需用 .decode("utf-8") 转换为字符串。
- 资源释放:对于长时间运行的子进程,需确保及时释放资源,避免僵尸进程(可通过
communicate() 或等待进程结束处理)。
- 跨平台兼容性:不同操作系统的命令不同(如
ls vs dir),需注意适配。
subprocess 模块通过灵活的参数配置,几乎能满足所有进程管理需求,是 Python 中处理外部命令的核心工具。