Python启动子进程无需等待的异常问题求助
解决Windows下subprocess.Popen启动子进程不独立运行的问题
问题根源
在Windows环境中,使用shell=True启动子进程时,父进程若直接退出,会连带终止其启动的shell进程(cmd.exe),进而导致子进程被强制结束。而添加wait()或读取stdout时,父进程处于等待状态,shell与子进程有足够时间完成启动,因此能正常运行。
解决方案
方案1:避免使用shell=True(推荐)
将命令拆分为参数列表直接传入Popen,无需通过shell中转,子进程会独立运行,不受父进程退出影响:
import subprocess # 拆分命令为参数列表,避免shell解析 cmd_args = [ 'D:/scripts/py/tview/venv/Scripts/python.exe', 'D:/scripts/py/tview/build/activities/subSystemScan_upload_scanner.py' ] # 重定向输出到DEVNULL,避免子进程因缓冲区满阻塞 p = subprocess.Popen( cmd_args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, # 可选:添加该参数会为子进程打开新控制台窗口,方便调试 # creationflags=subprocess.CREATE_NEW_CONSOLE ) # 父进程无需等待,直接执行后续逻辑 print("子进程已启动,父进程继续运行...")
方案2:使用shell=True时让子进程完全脱离父进程
若必须通过shell启动,可结合start /B命令让子进程在后台独立运行:
import subprocess # start /B 让命令在后台运行,脱离父shell的控制 command = 'start /B "" D:/scripts/py/tview/venv/Scripts/python.exe D:/scripts/py/tview/build/activities/subSystemScan_upload_scanner.py' p = subprocess.Popen(command, shell=True) # 父进程直接继续执行 print("子进程已启动,父进程继续运行...")
注:start后的空字符串""是必填的窗口标题参数,避免某些场景下命令解析出错。
内容的提问来源于stack exchange,提问作者user625079
相关产品推荐
相关产品推荐

