pyinstaller后不执行print且不能退出

问题遇到的现象和发生背景

Python3.8编写代码打包前正常运行,执行print语句,正常退出。但使用pyinstaller打包后的exe文件运行则不能执行print语句,也不退出。代码都全部执行,输出结果也是正确的。同一平台下的其它模块可以正常退出。

遇到的现象和发生背景,请写出第一个错误信息

报错信息是一直出现下面的提示:
请稍等,程序正在运行
这可能将需要一段时间

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

pyinstaller -D -w --key yy1234 --icon elsi1.ico test.py

运行结果及详细报错内容

img

img

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我原来以为是两个print语句问题,但删除这两个语句后仍然不能正常退出。原来这两个print语句不执行。尝试补充sys.exit(0)和os._exit(0),也不能正常退出。--noconsole也试过,没有效果。

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

我不希望打包成一个文件,因为那样启动速度慢。
我希望程序运行完成后正常退出。print语句问题再另想办法,现在关键是要正常退出!!

有用请采纳,点击右侧采纳即可:
问题原因:
pyinstaller在打包过程中会把程序窗口隐藏起来,导致print语句无法正常输出。

解决方法:
使用pyinstaller的--noconsole选项可以让程序以窗口的形式运行。

pyinstaller -D -w --noconsole --key yy1234 --icon elsi1.ico test.py

你编的不是个控制台程序而是窗口程序是吗
可是你在主线程里阻塞了,导致窗体无法显示,而没有控制台,所以print也没地方可打印

猜测是运行文件进入死循环了。单纯的复制粘贴这段代码在python环境是否可以直接运行,且运行、退出正常?

这可能是因为 PyInstaller 在打包 Python 代码时,把标准输入和标准输出重定向到了空设备(/dev/null)上。所以在打包后的 exe 文件中,print 语句就不会显示了。
可以通过在 PyInstaller 运行时加入“--noconsole”参数来解决这个问题。

img


这样打包出来的 exe 文件就会有一个控制台窗口,print 语句的输出将显示在其中,并且在程序正常退出后控制台窗口也将正常关闭。


发下你的代码, 帮你调试下

有可能是pyinstaller编译生成的程序在输出print语句时不能正常退出,导致程序一直运行。尝试在代码末尾加上sys.exit(0)或os._exit(0)。也可以考虑在打包时加上参数“--noconsole”,这样会生成一个没有命令行界面的程序。

此外,还可以考虑在程序代码中添加以下代码以解决问题:

if __name__ == '__main__':
    # your code
    sys.exit(0)

这样可以确保代码在正常运行完毕后退出,而不是一直保持运行状态。

还有一种解决方法是在使用 pyinstaller 打包代码时使用“--noconsole”选项。该选项指示 pyinstaller 在没有命令行窗口的情况下打包代码。因此,您可以执行以下命令:

pyinstaller --noconsole -D -w --key yy1234 --icon elsi1.ico test.py

这可以解决程序不能执行 print 语句和不能正常退出的问题。

最后,如果仍然无法解决问题,您可以尝试使用其他打包工具,例如 cx_Freeze。

望采纳。

建议采用以下方法:
1、使用pyinstaller -F --key yy1234 --icon elsi1.ico test.py进行打包
2、如果1行不通的话,,由于没有提供源码,所及建议尝试采用响应的函数将print需要打印的东西打印在GUI界面的相应位置上
如果问题得到解决请点 采纳~~

1、如果你希望程序运行完成后,执行输出语句并正常退出,可以直接在输出语句输出后,加上一个sys.exit()进行程序的结束
2、你在打包时需要注意打包的格式问题,在打包后希望看到print输出的内容,应该使用noconsole

从题目来看,你应该是想用pyinstaller打包发布程序,但是遇到了困难。
虽然我的回答看起来答非所问,但是我建议你使用Nuitka尝试下打包发布,换条路走也未尝不可。

我不知道,推荐

打包时加入--noconsole,另外代码中加了os._exit(0),这次可以正常退出了,但print打印的内容还是没有显示。
有人建议加入下面两句:


```python
 if sys.stdout.encoding != 'UTF-8':
        sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, 'strict')
  if sys.stderr.encoding != 'UTF-8':
        sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, 'strict')

 
就可以显示出print的打印内容,但我加入这几句代码后,提示错误是sys.stdout没有buffer这个属性,我使用的python3.8.3版本。这是怎么回事?

把print的语句行换成log日志记录方式输出到文件。

这个问题我经历过一次,
我当时的问题原因是由于增加了进度条控件,影响主业务执行导致的。
当时测试代码内还做了注释说明。业务调用进度条部分应该使用QtCore.QThread

img

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。
碰到打包成exe后运行有问题,可以通过不带-w的参数打包,这时打包的exe运行是带控制台的命令行。基本上所有的运行问题都可以通过控制台的命令定位和排查。