Python转exe后如何隐藏subprocess调用Powershell的控制台窗口
解决PyInstaller打包后弹出Powershell控制台的问题
核心原因
直接调用powershell.exe时,即便加了-WindowStyle Hidden,Windows仍可能为控制台程序创建窗口,尤其是当父进程通过PyInstaller的--noconsole参数打包为无窗口程序时,子进程的控制台窗口会被强制弹出。
可行解决方案
1. 给subprocess添加Windows专属启动标志
通过设置subprocess.CREATE_NO_WINDOW标志,强制子进程不创建控制台窗口,同时配合STARTUPINFO参数增强效果:
import subprocess import sys # 针对Windows平台配置启动参数 if sys.platform == "win32": startup_info = subprocess.STARTUPINFO() startup_info.dwFlags |= subprocess.STARTF_USESHOWWINDOW creation_flags = subprocess.CREATE_NO_WINDOW else: startup_info = None creation_flags = 0 # 执行ssh命令(注意将命令拆分为列表形式,避免解析问题) proc = subprocess.Popen( ["powershell.exe", "ssh", "-p", "你的端口号", "你的ssh目标"], startupinfo=startup_info, creationflags=creation_flags, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False # 必须设为False,否则creation_flags可能无效 )
2. 增强Powershell的隐藏参数
单独的-WindowStyle Hidden可能不够,搭配-NoProfile和-NonInteractive可以避免加载配置和交互,进一步减少窗口弹出概率:
# 基于方案1的基础上修改命令列表 proc = subprocess.Popen( ["powershell.exe", "-NoProfile", "-NonInteractive", "-WindowStyle", "Hidden", "ssh", "-p", "你的端口号", "你的ssh目标"], startupinfo=startup_info, creationflags=creation_flags, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False )
3. 跳过Powershell直接调用ssh.exe
如果你的Windows系统已安装OpenSSH客户端(当前为Windows默认组件),可以直接调用ssh.exe,完全避免启动Powershell:
proc = subprocess.Popen( ["ssh.exe", "-p", "你的端口号", "你的ssh目标"], creationflags=subprocess.CREATE_NO_WINDOW, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=False )
额外注意事项
- PyInstaller参数中
--windowed和--noconsole是重复的,保留其中一个即可,不影响最终效果。 - 命令必须拆分为列表形式传递给
Popen,如果用字符串形式且shell=True,CREATE_NO_WINDOW标志可能无法生效。
内容的提问来源于stack exchange,提问作者Ali Ent
相关产品推荐
相关产品推荐

