Pyinstaller打包常见问题
AI摘要: 本文介绍了使用PyInstaller打包Python程序时遇到的常见问题及解决方案。首先,文章提供了PyInstaller的基本命令和参数解释,如-Fw用于生成单个可执行文件并隐藏控制台窗口,--add-data用于添加资源文件。接着,文章讨论了两个主要问题:一是由于使用Anaconda导致打包后的程序体积过大的问题,建议通过创建虚拟环境并仅安装必要库来解决;二是打包后缺少资源文件的问题,提出了两种解决方法:一种是编写hook脚本来指定需要包含的资源文件夹或文件;另一种是利用--add-data选项直接在命令行中指定要添加的数据路径和目标位置。
常用命令
pyinstaller -Fw main.py --add-data "源地址;目标地址"
-F 是主文件, -w是不要出现命令行, --add-data 主要是添加资源文件
常见问题
使用了anaconda而导致体积过大
pyinstaller不会按需打包库,会直接把环境里的所有库打包进exe,所以为了只打包需要的库,可以使用virtualenv来创建一个新的虚拟环境,这里面只安装需要的库,最后打包即可
打包后缺少资源文件
一般来说,部分库使用的资源文件不会被pyinstaller打包进来,那么运行的时候就会显示报错。
网上有种解决办法就是添加“hook-xxx.py”文件,放入pyinstaller的hooks文件夹中,内容一般如下:
from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files('jieba') # 注意这里是库的名字,不是缺少资源文件的名字
在运行pyinstaller生成的exe时,会在 C:\Users\xxxx\AppData\Local\Temp\_MEI367082 类似的地方存放所有的运行文件,那么上面的hook文件就是说,在这个_MEI367082的文件夹下放入jieba整个库,这当然可以解决jieba的资源文件招不到的问题,但是,为了一个找到一个stopwords.txt(5MB)而放入一整个jieba库(30MB)显得得不偿失。
如果使用add-data呢?比如运行
pyinstaller main.py \
-i "res\logo.ico" \
--add-data=".\*.txt;." \
--add-data=".\*.json;."\
--add-data="res\*.*;.\res"\
--add-data="dist\models\*.*;.\models"
上面这个方法就可以很好解决,注意加入多个资源文件的写法,添加图标的写法,以及最重要的资源文件的位置写法 “源地址;目标地址”