pyinstaller打包没有命令行窗口就无法运行的解决方案

解决exe有命令行窗口可以运行,无命令行窗口就无法正确运行

最近在做一个项目需要将python代码打包成exe文件,根据网上各种关于pyinstaller的介绍以及排错,终于打包好了console=True能运行,然而当我选择console=False再打包时却无法正确运行了,而且关闭软件之后进程仍然存在。网上找了很久也没有解决,于是自己用VS去调试exe,发现无命令行的软件又可以运行了。VS调试配置如下:pyinstaller打包没有命令行窗口就无法运行的解决方案_第1张图片
当我把IO重定向禁用,发现程序又不能运行了,所以我怀疑就是IO重定向的问题。因为我的代码中需要将运行迭代的进度输出出来,所以没有命令行窗口就无法提供一个输出的容器,程序也就无法回调确认进度是否完成,也就陷入了死循环,所以进程也就无法结束。
python中IO重定向有很多方法,这里我选择将标准输出重定向至内存,由内存来存放程序的运行进度,然后写入日志文件。这里我们需要知道自己的程序输出的是stdout还是stderr,我们可以通过pycharm的输出结果查看:
pyinstaller打包没有命令行窗口就无法运行的解决方案_第2张图片
pycharm中红色字体表示stderr,白色字体表示stdout,我的进度条是红色的也就是stderr。

import io
import sys
# 创建一个字符串缓冲区
output = io.StringIO()
# 重定向 stderr 到字符串缓冲区
sys.stderr = output
#这里可以插入有标准输出的代码,如print()等
#将stderr内容写入到日志文件
with open("log.txt","w",encoding="utf-8") as f:
	f.write(sys.stderr.getvalue())

通过添加上面的代码,终于成功解决了困扰很久的pyinstaller打包问题

你可能感兴趣的:(python,python,软件构建,运维开发)