利用Pyinstller打包python程序全记录
参考内容
http://c.biancheng.net/view/2690.html
https://blog.csdn.net/humanking7/article/details/80419628
https://blog.csdn.net/weixin_39000819/article/details/80942423
https://guangmujun.cn/archives/168
一、pyinstaller
1.1安装
安装pyintaller与安装其他python第三方包一样,使用pip/pip3命令即可安装。
首先打开命令行工具,这里使用快捷方式win+R
打开【运行】,在【运行】中输入cmd
后打开即进入命令行,后使用如下命令安装pyinstaller。
pip install pyinstaller
安装成功后可以看到:
Successfully installed pyinstaller-x.x.x
其中x.x.x表示所安装的pyinstaller的版本。
另,若安装时出现pip相关问题,提供以下两种解决方案用以参考:
(1)使用如下命令安装:
python -m pip install pyinstaller
(2)下载对应的.whl
文件后安装:
首先去pyinstaller官网下载安装包:pyinstaller-DownLoads注意是下载release下的安装包
下载完成并解压,使用命令行工具进入文件夹目录下后,输入命令
python setup.py install
敲回车安装。
若提示缺少pywin32
则先到pywin32官网下载pywin32
安装包,使用命令行工具进入pywin32.whl
所在的文件夹内,运行命令:
pip install pywin32-xxx-cpxx-cpxxx-win32.whl
其中xxx由于下载的版本不同有一定的出入。
安装pywin32
成功后,在pyinstller
文件夹内再次采用上述方法安装,即可成功。
#####1.2详细参数、文件内容
pyinstaller提供了许多参数用以实现针对使用者不同需求的个性化打包功能。
具体各个参数的描述及使用推荐看这篇博客,写的很详细:Pyinstaller各参数含义
二、打包
在安装pyinstaller成功、对各参数具有初步了解的基础上,开始正式使用pyinstaller打包python脚本(.py)。
2.1进入文件目录
首先,我们使用cmd
命令进入命令行模式,并进入python脚本所在的文件夹。这里建议在桌面新建一个文件夹并将python脚本拷贝到这个文件夹内,一是为了进入目录时不需要敲太复杂的命令浪费时间,另一个是在打包及打包成功运行exe程序时会出现一些问题,解决问题后需要删除原来的文件重新打包。
2.2 利用命令打包
2.2.1利用.py文件
在cmd命令行模式下进入到.py
文件所在的文件夹后,使用:
pyinstaller -F xx.py
其中,参数-F
为打包成功后只有可执行文件.exe
,这时所有的第三方库与依赖文件均打包在一起。其他参数使用可参考上面的参数详情链接。
打包过程及打包好的界面如图:
.py结尾为我们打包使用的源文件,
.spec结尾为打包过程中形成的参数文件,打包成功得出的
.exe`文件在【dist】文件目录下。
2.2.2利用.spec文件
在使用pyinstaller打包python文件时,可能会出现想要修改打包出来的文件名、添加依赖包、添加隐藏包等等,这时我们通过使用.spec
文件进行打包。
1、首先使用py文件的打包方法打包一次,在文件夹中就会出现先一个和py文件同名的.spec文件,然后将文件夹下的其他文件夹均删除只留下py文件和spec文件。然后使用记事本打开spec文件,对其中的参数进行修改并保存。
2、打开cmd命令行模式,进入py文件及spec文件所在文件夹,使用命令:
pyinstaller -F XX.spec
打包成功后就可以得到.exe文件了。
需要注意的是,spec文件会与命令行参数存在一定冲突。比如我想打包出的程序在运行时不显示控制台,在命令行中使用py文件打包时加上相应参数就可以了,但是在使用spec文件打包时需要修改spec文件中相应的参数,不然即使是在命令中添加参数了,但是没有在spec文件中修改也起不到任何效果。
三、错误解决
使用pyinstaller进行打包python文件时会遇到很多错误,网上有很多大佬进行分享,在这里我只展示我遇到的错误及解决方案,如果没有帮到您或者您没遇到的话,可以去论坛里再搜一搜。
1、pyproj相关
问题:
ModuleNotFoundError: No module named 'pyproj._datadir'
解决办法:
(1)到官网下载安装包重新安装即可:点击进入官网下载对应版本的.whl
文件,命令行模式进入文件所在文件夹后,使用命令:
pip install xxxxxxxxxxxxxxxxxxx.whl
(2)若重新安装依然出现上述错误,那么就要使用spec的打包方法,在spec文件中新增隐藏包。
打开spec文件,在Hidden import
部分添加hiddenimports=['pyproj.datadir'],
保存后重新打包即可。
2、numpy相关
问题:
ModuleNotFoundError: No module named 'numpy.random.common'
解决办法:
在打包的py文件中添加如下代码:
enter import numpy.random.common
import numpy.random.bounded_integers
import numpy.random.entropy
3、fiona相关
问题:
File "site-packages\fiona\collection.py", line 9, in <module> ImportError: DLL load failed: 找不到指定的模块。
解决方案:
在py文件中添加:
from osgeo import ogr
from osgeo import gdal
from fiona import _shim, schema
4、geopandas库相关
问题:
File "site-packages\geopandas\datasets\__init__.py", line 7, in <module>
StopIteration
[6764] Failed to execute script application
解决方案:
找到geopandas库文件下的__init__.py,将import geopandas.datasets这句注释掉
5、IndexError: list index out of range
这个问题是与PyQt相关的问题,在打包好文件后,运行时在QT界面选择文件打开时遇到这个问题。后经排查,是在打包过程中使用了中文路径的问题,将文件放到英文路径下重新打包,问题解决。
6、shapely库相关
问题:
Unable to find "e:\github\forexe\venv\lib\site-packages\shapely\DLLs\geos.dll" when adding binary and data files.
解决方法:在shapely库文件目录下,找到geos_c.dll文件,将其复制一份重命名为geos.dll
7、rtree相关
问题:错误提示找不到rtree相关文件
解决办法:向系统环境变量中添加rtree包所在路径后重新打包
8、utf-8相关
问题:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position XXX: invalid continuation b
解决方案:
(1)将py文件中的所有中文注释删除
(2)在打包前,在cmd命令行中输入:
chcp 65001
四、缩小EXE大小
打包后的exe文件可能有几百兆,启动也十分缓慢。这里介绍三种方法。
1.纯净python打包:
(1)新建user[推荐]:
在系统中新建一个user,然后在开始菜单中切换到该用户,重新安装python环境并在该python环境下运行py文件,会提示缺少很多包。这时候我们一遍一遍的安装所有提示缺少的包,最后用上述方法打包,打包好的程序基本上控制在100M左右。
(2)虚拟python:
2、uxp压缩