pyinstaller打包报错
[TOC]
Pyinstaller打包
打包指令
1 | >pyinstaller -D -w xxx.py |
其他参数
1 | -F |
1 | -D |
1 | --key=keys |
1 | -w |
1 | -c |
1 | -i file.ico |
1 | -h |
1 | # 其他(不常用) |
打包产生的文件
打包单文件
exe文件
生成的可执行文件可以在 dist 文件夹中找到
包含了你的 Python 代码和所有依赖项,以便你可以在其他计算机上运行它而无需安装 Python 解释器或其他依赖库。
生成的可执行文件的名称通常与你的 Python 脚本文件的名称相同(默认情况下)
打包多文件
build
临时文件夹,包含已经编译但尚未打包成最终可执行文件的文件和目录。在打包过程完成后,这个文件夹可以被删除,因为这些临时文件已经不再需要。
dist
最终结果文件夹。其中最重要的文件是exe或应用程序的主文件。此文件夹中的其他文件和目录可能会包含有关打包过程中使用的库、依赖项和资源的信息。
.spec
配置文件,它是一个 Python 脚本文件,用于指定打包过程的参数和选项。
如果在打包时提供了 .spec 文件,PyInstaller 将使用该文件中指定的配置进行打包,否则将使用默认配置。
pyinstaller yourscript.spec
打包环境
anaconda环境
输入命令后打包报错,百度未能解决
1 | Traceback (most recent call last): |
系统环境
打包成功后报错
1 | Error loading Python DLL |
这是因为程序是在anaconda环境下写的,系统环境没有下载相应模块,所以有缺失错误。
除此之外,pyinstaller会将无用的模块也导入进去,所以不推荐此打包方法。
虚拟环境(anaconda prompt)
所谓的虚拟环境,就是创建一个没有第三方库和模块的 Python 环境。
1 | conda命令 |
步骤:
创建虚拟环境
1
2conda create -n env_1 python==3.10.8
# 问你新环境是否需要安装这些包,Y确定即可1
2
3
4
5
6
7
8
9
10
11如果报错
Collecting package metadata (current_repodata.json): failed
UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel simple <https://pypi.mirrors.ustc.edu.cn/simple>
The channel is not accessible or is invalid.
You will need to adjust your conda configuration to proceed.
Use `conda config --show channels` to view your configuration's current state,
and use `conda config --show-sources` to view config file locations.
搜索.condarc文件删除即可进入虚拟环境
1
2
3
4
5conda activate audiotool
当(base) D:\AudioReceptionTester>
变成(audiotool) D:\AudioReceptionTester>
表示已经进入安装需要的第三方包
如果程序还用到了其他的第三方库,那么就需要把这些库给添加进虚拟环境,添加方式就是直接在当前环境下用 pip。
1
2
3
4
5镜像
-i https://pypi.tuna.tsinghua.edu.cn/simple
-i https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
-i https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
-i https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/更极致的exe大小
如果想让其小到不能再小,那么就要尽可能地删去虚拟环境里面的一些用不到的包(用 pip uninstall 来删)
1
2查看安装的包
conda list
安装第三方包问题
引用与包名不一致
1
2
3
4
5
6
7# 举例:serial包
# 在import时就是serial
# 实际上pip安装的是pyserial包
import serial
pip install pyserial
# ps:pyinstaller不会因为这个找不到模块(亲历)引用奇怪
1
2
3
4
5
6# 举例:还是serial
# 这次是serial.tools
import serial.tools.list_ports
pip install serial.tools
# ps:serial.tools会携带安装pyserial,并且该import也会把pyserial中的内容导入进去,所以只写serial.tools的import也是能够运行的安装一个包中附带其他包
1
2
3# 举例:pandas
# pandas安装时候包含了numpy
# 如果卸载numpy,会提醒缺失moudle numpy内置模块不用安装
1
2# 举例:os, time, sys
# 会报错ERROR,找不到这个包
其他问题
.spec文件每次打包时最好删掉
.spec文件是打包的配置文件,打包时会默认按照这个文件内容执行,如果你发现修改报错后,依然报同样的问题,请查看.spec文件是否删除。
报错
ModuleNotFoundError
解决方法:
- 虚拟环境没安装pyinstaller,会调用全局的,所以需要安装
- 即使存在pyinstaller,也可以卸载重装,我就是重装就好了,很迷,人都给我整崩溃了。
RuntimeError: Unable to open/read ui device
ui文件读取错误
解决方法:
- 缺失资源文件,把资源文件根据你的相对路径添加到dist目录下,打包的目录中就可以了
参考资料
用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)