利用Pyinstller打包python程序全记录

利用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压缩

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值