Python3.8编写代码打包前正常运行,执行print语句,正常退出。但使用pyinstaller打包后的exe文件运行则不能执行print语句,也不退出。代码都全部执行,输出结果也是正确的。同一平台下的其它模块可以正常退出。
报错信息是一直出现下面的提示:
请稍等,程序正在运行
这可能将需要一段时间
pyinstaller -D -w --key yy1234 --icon elsi1.ico test.py
我原来以为是两个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”参数来解决这个问题。
发下你的代码, 帮你调试下
有可能是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
题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。
碰到打包成exe后运行有问题,可以通过不带-w的参数打包,这时打包的exe运行是带控制台的命令行。基本上所有的运行问题都可以通过控制台的命令定位和排查。