在 Python 中,subprocess.Popen 是启动和管理第三方程序的强大工具。以下是关键知识点和使用示例:
基础用法
import subprocess
# 启动程序(阻塞式等待)
process = subprocess.Popen(["notepad.exe"])
process.wait() # 等待程序结束
# 启动程序(非阻塞)
process = subprocess.Popen(["calc.exe"]) # 后台运行计算器
print("程序在后台运行,继续执行脚本...")
核心参数说明
核心参数说明
| 参数 | 作用 |
|---|---|
args | 命令列表(推荐)或字符串(需 shell=True) |
stdout | 重定向输出(subprocess.PIPE 捕获输出) |
stderr | 重定向错误(subprocess.STDOUT 合并到 stdout) |
stdin | 提供输入 |
cwd | 设置工作目录(默认当前目录) |
shell | 通过系统 shell 执行(Windows 必需 .bat/.cmd,有安全风险) |
creationflags | Windows 专用标志(如隐藏窗口) |
实用场景示例
1. 捕获输出
python
# 危险!可能被注入
subprocess.Popen(f"dir {user_input}", shell=True)
# 安全替代方案
subprocess.Popen(["dir", sanitized_input])
2. 实时读取输出流
python
with subprocess.Popen(
["python", "-u", "real_time_script.py"], # -u 禁用缓冲
stdout=subprocess.PIPE,
text=True,
bufsize=1 # 行缓冲
) as proc:
for line in proc.stdout:
print(f"实时输出: {line.strip()}")
3. 隐藏控制台窗口(Windows)
python
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.Popen(
["my_app.exe"],
startupinfo=startupinfo,
creationflags=subprocess.CREATE_NO_WINDOW
)
常见问题解决
-
程序不退出:检查是否在等待子进程(使用
wait()/communicate()) -
中文乱码:设置
encoding="utf-8"或系统对应编码 -
权限问题:以管理员身份运行 Python 脚本
提示:对于简单命
令,可考虑更高级的
subprocess.run()(Python 3.5+)
令,可考虑更高级的
1337

被折叠的 条评论
为什么被折叠?



