为何subprocess.Popen无法从.pyw文件中正常启动应用?
.pyw文件中使用subprocess启动Chrome失败的解决方案
在Windows10+Python3.10环境下,.py格式的脚本可以通过subprocess正常启动Chrome,但改成.pyw格式后,触发快捷键时会弹出空白窗口后关闭,无法打开Chrome,也无报错信息。原代码如下:
from subprocess import Popen, STDOUT, DEVNULL Popen([r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'], stdout=DEVNULL, stderr=STDOUT
问题原因
- 代码存在语法错误:最后一行缺少闭合的右括号。
- .pyw运行时无控制台窗口,subprocess默认的进程创建方式会尝试关联控制台,导致异常,进而无法正确启动目标程序。
修复步骤
1. 修复语法错误并添加进程创建标志
使用CREATE_NO_WINDOW标志禁止创建控制台窗口,同时添加Chrome参数确保打开新窗口:
from subprocess import Popen, STDOUT, DEVNULL, CREATE_NO_WINDOW # 添加--new-window参数强制打开新Chrome窗口,修复语法错误并添加CREATE_NO_WINDOW标志 Popen( [r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe', '--new-window'], stdout=DEVNULL, stderr=STDOUT, creationflags=CREATE_NO_WINDOW )
2. 备选方案:使用startupinfo隐藏窗口
如果上述方案无效,可以通过STARTUPINFO设置窗口隐藏属性:
from subprocess import Popen, STDOUT, DEVNULL, STARTUPINFO, SW_HIDE, STARTF_USESHOWWINDOW startupinfo = STARTUPINFO() startupinfo.dwFlags |= STARTF_USESHOWWINDOW startupinfo.wShowWindow = SW_HIDE Popen( [r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe', '--new-window'], stdout=DEVNULL, stderr=STDOUT, startupinfo=startupinfo )
3. 路径优化(可选)
如果Chrome已添加到系统PATH,可以直接简化启动命令:
Popen(['chrome.exe', '--new-window'], stdout=DEVNULL, stderr=STDOUT, creationflags=CREATE_NO_WINDOW)
说明
CREATE_NO_WINDOW是Windows平台特有的参数,用于告诉系统不要为子进程创建控制台窗口。--new-window是Chrome的命令行参数,确保每次启动都打开独立的新窗口。- .pyw脚本运行时无控制台输出,建议先在.py模式下测试代码逻辑,确认正常后再改为.pyw格式。
内容的提问来源于stack exchange,提问作者Joe Cherveny
相关产品推荐
相关产品推荐

