运行 pyinstaller 打包成的exe 闪退

pyinstaller官方文档

虽然是英文,但能看就能少走很多弯路,像使用-F打包,遇到fileNotFoundError之类的问题,都能知其然,知其所以然地解决。

以下是摘录的一段打包单文件的工作原理

The bootloader is the heart of the one-file bundle also. When started it creates a temporary folder in the appropriate temp-folder location for this OS. The folder is named _MEIxxxxxx, where xxxxxx is a random number.
The one executable file contains an embedded archive of all the Python modules used by your script, as well as compressed copies of any non-Python support files (e.g. .so files). The bootloader uncompresses the support files and writes copies into the the temporary folder. This can take a little time. That is why a one-file app is a little slower to start than a one-folder app.
After creating the temporary folder, the bootloader proceeds exactly as for the one-folder bundle, in the context of the temporary folder. When the bundled code terminates, the bootloader deletes the temporary folder.




  • 本文记录本人使用pyintaller打包项目时的问题与解决方法

  • 工作环境

Microsoft Windows [版本 10.0.17763.437]
© 2018 Microsoft Corporation。保留所有权利。
Python 3.7.0
pyinstaller 3.4

  • 问题一

    在控制台运行pyinstaller bayes.py打包文件,发现控制台除info外,还有Traceback,发现是缺少模块,安装模块解决。

    问题截图
    运行 pyinstaller 打包成的exe 闪退_第1张图片
    运行 pyinstaller 打包成的exe 闪退_第2张图片

    解决办法
    运行 pyinstaller 打包成的exe 闪退_第3张图片


  • 问题二

    得到exe文件后,双击运行,弹出控制台后闪退,用录屏方式获取控制台的输出内容,发现是找不到依赖的外部文件(我的这个py文件运行时,要读取的一个文本文件),搜集网上资料,发现要将依赖的外部文件放在exe同目录下,ctrl+c ctrl+v解决。

    问题截图运行 pyinstaller 打包成的exe 闪退_第4张图片

    解决办法
    运行 pyinstaller 打包成的exe 闪退_第5张图片


  • 问题三

    dist文件夹拷贝到没有python环境的windows系统的电脑,点击exe,发现不能运行,从一闪而过的控制台了解错误信息。
    原因:由于我使用了结巴分词,此处需要依赖结巴分词dict.txt文件,在exe同级目录下,创建jieba文件夹,复制dict.txt文件到jieba文件夹下,解决问题。

    问题截图
    运行 pyinstaller 打包成的exe 闪退_第6张图片


  • 问题四

    到第三台电脑实验,发现jieba模块还是报错,还是找不到dict.txt文件,且路径与电脑依赖较大,不能像问题三那样复制文件了,上网查阅资料,代码指定jieba模块加载文件即可。

    问题截图
    运行 pyinstaller 打包成的exe 闪退_第7张图片

    解决办法
    指定jieba模块加载文件

    	from jieba import cut,set_dictionary as jieba_set_dict,initialize as jieba_init
    	
    	# 初始化jieba模块
    	jieba_set_dict(r"statistic/dict.txt")
    	jieba_init()
    

你可能感兴趣的:(python)