Pyinstaller打包python程序时遇到的坑

发布于 2020-03-04  622 次阅读


近段时间需要打包几个python小程序,在使用pyinstaller打包过程中遇到了几个坑,所以做一下记录,方便以后查看。

pyinstaller使用方法

pyinstaller安装方法:

pip install pyinstaller

pyinstaller使用方法:

pyinstaller demo.py  #生成可执行文件
"""
参数        效果
-D(默认选项)  除了demo.exe外,还会在在dist中生成很多依赖文件,推荐使用
-F           只在dist中生产一个demo.exe文件(会比较大)
-w           只对windows有效,不使用控制台   
-c(默认)    只对windows有效,使用控制台 
-i file.icon 将file.icon设置为exe文件的图标 
更多用法请使用 pyinstaller --help 或者 -h  查看
"""

   

pyinstaller 注意事项

1.pyinstaller生成文件体积较大,尽量少import库,更不要import没有用到的库

pyinstaller打包生成的程序比较大,一个hello world有可能都有几M。你的程序import的库会显著增大最后的程序体积,特别是numpy、pandas这种比较大的库,所以如果不是程序必须,需要pyinstaller打包的程序尽量少import一些库。

并且pyinstaller不会检查你的库是不是真的用到了,只要你import了某个库,尽管你没有真的使用它的功能,pyinstaller也会打包进来!对于我这种写什么程序都要import numpy,pandas这种人来说,这一点太坑了,我也是试了几次才发现,去掉了几个库,程序最终的体积从1G降到了几十M。。。。

还有一个小技巧:使用 from xxx import xxx ,尽量不要用 import xxx ,可以显著减少程序体积。

2. pyinstaller指定的程序图标只能是"xxx.ico"文件,否则会报错

pyinstaller只能使用.ico格式的图标,否则会报错。。。(可恶的是报错不会提示是图标格式错误

pyinstaller报错解决方案

【挖坑】ㄟ( ▔, ▔ )ㄏ 之前的资料找到了再总结

1. no module named 'pkg_resources.py2_warn’

这是setuptools 45.0.0版本引起的问题,具体原因可以去setuptools的github issue页面 查看,以下是搜集到的解决方法:

sol1. 降级setuptools

pip uninstall setuptools
pip install setuptools==44.0.0

sol2. 手动添加对pkg_resources.py2_warn的依赖,你可以在打包时指定--hiddenimport 参数 pyinstaller --hiddenimport xxxx(需要import的包) ,或是修改spec 文件,方法如下:

step1 pyinstaller打包你的程序,在程序目录下会一个生成.spec文件,这是pyinstaller打包时自动生成的配置文件

step2 打开这个文件,在Analysishiddenimports列表中添加 'pkg_resources.py2_warn',如下:

a = Analysis(...,
             hiddenimports=['pkg_resources.py2_warn'],
             ...)

step3 再次运行pyinstaller,不过这次命令是pyinstaller xxx.spec。如果还出现一些缺少的依赖项,就再次修改.spec文件就好了。

2. attribute error: module 'win32ctypes.pywin32.win32api' has no attribute 'error'

这是因为你使用了不是.ico 格式的图标或是你的icon图标格式有问题。解决方案:将图标转换成标准的.ico文件,google上有很多在线的图片转换工具。


森林里的动物不能一直停留在海滩上