Pyinstaller 打包失败解决办法
在日常生活中我们写的python脚本需要在别人的电脑上使用,但别人的电脑又没有python环境,这时候将我们写的Python脚本打包成“.exe”可执行文件,这样就无需在另一台电脑上配置相应的环境了。
python提供了一个打包的库叫做Pyinstaller,理想情况下可以实现一键打包。然而在实际打包中会存在下列问题:
- 依赖库太多,打包耗时长(将一些没用上的库一起打包上去)
- 打包完的exe文件太大
- 打包完的exe文件打不开 (打开后控制台闪了一下就关闭了,程序无法运行)
- 可能会出现各种文件缺失
分享一下,我使用Pyinstaller打包脚本出现的问题
在 cmd 使用 pyinstaller -F 文件名.py
打包成功后双击打开直接闪退,连报错都看不到。。。。
这里分享一个看到报错信息的办法:
还是打开 cmd cd 命令进入打包文件所在文件夹,再输入文件名.exe,最后回车就可以看到了
下面是我的报错(省略中间一部分):
Traceback (most recent call last):
File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line 151, in __init__
File "ctypes\__init__.py", line 373, in __init__
FileNotFoundError: Could not find module 'libiconv-2.dll'. Try using the full path with constructor syntax.
File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line 153, in __init__
__main__.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\27540\\AppData\\Local\\Temp\\_MEI162522\\pyzbar\\libiconv-2.dll'. Most probably this dynlib/dll was not found when the application was frozen.
[10832] Failed to execute script Filename_tool
可以看到 FileNotFoundError: Could not find module 'libiconv-2.dll’
少了 libiconv-2.dll
我去百度寻找解决办法,让我去根据报错缺啥补啥,可以看到:C:\Users\27540\AppData\Local\Temp\_MEI162522\pyzbar\libiconv-2.dll’. Most probably this dynlib/dll was not found when the application was frozen.
那我乖乖的在 Temp_MEI162522\pyzbar\libiconv-2.dll 补充文件,再重新打包
同样是这个报错。。。。。。甚至想放弃。。。。
几天后我看到一篇文章在PyCharm创建虚拟环境的文章
就想用虚拟环境打包会不会成功呢,在网上查阅相关资料后,找到创建虚拟环境的办法
最后用虚拟环境打包还是有报错,同样是缺了 libiconv-2.dll 但是这次根据报错去补充缺失文件,就能够成功运行;
具体创建过程见下列步骤:
1.配置虚拟环境
1.1打开PyCharm,新建项目
1.2点击New Project
1.3Location:选择一个空文件夹
1.4选择一个编译器
1.5导入需要的库(可以找到第三方库直接复制进去)
1.6把需要打包的.py文件复制到venv文件夹下
2.激活虚拟环境
2.1 cd到该环境下的Scripts路径下,使用activate命令激活环境。看到出现(虚拟环境名),如(venv),说明激活虚拟环境成功。
2.2在虚拟环境下打包
- cd 到项目文件夹下
- 输入
Pyinstaller -p 虚拟环境的Scripts路径 py文件名
,例如:Pyinstaller -p D:\个人数据\new_test\venv 文件名.py
2.3 打包需要等待一会,打包成功后,可以看到生成了dist、build、文件名.spec等文件。其中有用的只有dist一个文件,.build和.spec文件可以直接删除。进入dist文件夹找到.exe文件,双击运行该可执行文件。
2.4 双击.exe文件运行,如果还出现闪退,重复上述方法查看报错信息
2.5都没有问题后就可以直接使用了,发给别人用好像需要整个dist文件夹一起发过去才能使用(我也不清楚)有兴趣可以自己尝试一下
以上就是全部内容啦,第一次写博客,有问题可以评论区交流。