Python subprocess.Popen 打开第三方程序

在 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,有安全风险)
creationflagsWindows 专用标志(如隐藏窗口)

实用场景示例

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+)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值