Python 3调用subprocess系列接口等待子进程时触发崩溃问题求助
问题原因和修复方案
- 手动拼接命令字符串的写法存在隐患:Windows 下命令行参数转义规则复杂,手动拼接很容易触发解析错误,subprocess 原生支持列表形式传参,会自动处理所有转义逻辑,不需要手动加空格、引号处理特殊路径。
- 等待时崩溃的核心原因是子进程运行过程中会向标准输出/标准错误流写入数据,你的代码没有消费这些输出,流缓冲区被占满后子进程阻塞,进而导致父进程在
sleep/wait时触发异常崩溃。
修复后的代码示例
import subprocess import time cmd = "C:/Program Files (x86)/Phoenix Contact Software/TPS Configurator/FS_PROG/FS_PROG.exe" # 所有参数按顺序放在列表中,不需要手动处理引号和空格 args = [ cmd, "tps_configurator.xml", "192.168.16.227", "192.168.16.29", f"{intmac:012X}", f"{intmac + 1:012X}", f"{intmac + 2:012X}", "0" ] # 显式将子进程的输入、输出、错误流重定向到空,避免缓冲区占满导致阻塞 p = subprocess.Popen(args, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) time.sleep(5) input("\npress enter to quit")
如果你需要使用 subprocess.run、subprocess.call,也可以传入相同的流重定向参数即可解决崩溃问题。如果需要获取子进程的输出,可以将 stdout、stderr 设为 subprocess.PIPE,之后调用 p.communicate() 读取输出,不要直接调用 p.wait(),避免缓冲区满阻塞。
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

