目录
pyinstaller -F -w main.py
打包常用指令
-i 给应用程序添加图标
-F 指定打包后只生成一个exe格式的文件
-D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c –console, –nowindowed 使用控制台,无界面(默认)
-w –windowed, –noconsole 使用窗口,无控制台
-p 添加搜索路径
问题一:.exe文件过大
打包命令:
pyinstaller -F -w main.py
解决方法:
新建了一个虚拟环境,在其中重新安装了所需的库。
安装虚拟环境依赖包:
pip install virtualenv
pip install virtualenvwrapper-win
找到自己python.exe所在位置,创建虚拟环境
mkvirtualenv -p="E:\\Python\python.exe" pyinenv
在需要打包的文件目录上输入cmd,使用如下命令切换到虚拟环境中
workon pyinenv
使用命令python main.py
运行要打包的主程序,根据弹出缺少的模块依次下载。
注意:需要重新安装pyqt5和pyqt5-tools,以及pyinstaller等,这些运行过程中不会报错。
在下载的时候发现torch里面的cuda占的内存很大,索性在代码中取消了使用cuda加速的部分,并把torch-cuda删除,重新下了个没有cuda的torch、torchvision等
问题二:pyinstaller与opencv-python版本不兼容
打包完成后出现下面窗口。
解决:修改opencv-python的版本pip install opencv-python==4.5.1.48
我是用的python和pyinstaller的版本如下:
PyInstaller: 5.1
Python: 3.9.0
opencv-python:4.5.1.48
问题三:打开文件时提示***.pyd文件已存在
在a和p之间加入下面代码:
for b in a.binaries.copy(): # Traver the binaries.
for d in a.datas: # Traverse the datas.
if b[1].endswith(d[0]): # If duplicate found.
a.binaries.remove(b) # Remove the duplicate.
break
操作完之后换成这个打包命令:
pyinstaller main.spec
参考:Pyinstaller --onefile warning file already exists but should not
参考:WARNING: file already exists but should not: C:\Users\workAI\AppData\Local\Temp_MEI132522\torch_C
参考:【Python】Python打包exe报错makespec options not valid when a.spec file is given
问题四:pyinstaller打包时提示UPX is not available.
解决:
(1) 到官网 https://upx.github.io/ 下载了UPX(我的是Window 64版本), 下载下来是一个压缩包
(2) 解压得到 upx.exe文件
(3) 把exe文件拷贝到pyinstaller.exe目录下, 我的是 C:\Users\HASEE\Envs\pyinenv\Scripts
参考:pyinstaller打包时提示UPX is not available
最终,打包完成并能成功使用。(打包过程用了4分钟左右)
问题五:打包后运行.exe时报错:FileNotFoundError
报错类型:
- FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ADMINI~1\AppData\Local\Temp\_MEI317882\ansys\api\mapdl\VERSION
- FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘C:\Users\ADMINI~1\AppData\Local\Temp\_MEI276362\vispy\glsl’
- FileNotFoundError: [Errno 2] No such file or directory: ‘F:\code\ui_submit\dist\main_ui\_internal\ansys\api\platform\instancemanagement\VERSION’
出现类似上述错误类型的原因是在运行打包的可执行文件时,程序试图从一个临时目录中读取文件,但该文件不存在。
解决方案:
-
定位文件: 在你的 Python 环境中,找到缺少文件的实际路径。根据错误提示,它可能位于…\Lib\site-packages\ansys\api.和…\Lib\site-packages\vispy\glsl.目录下。如果发现这些位置确实存在所需文件,可以进行下面的步骤,如果没有,说明环境中压根没有安装这些库,需要先安装。
-
在项目文件夹中新建一个hooks文件夹。
-
在hooks文件夹下手动编写hook文件,其实就是python文件,注意hook文件的命名需要与缺少的包的命名一致,可以查看后续的编写示例。
-
在控制台中将目录转移到当前项目文件夹下,用cd命令。
-
执行命令pyinstaller --clean --additional-hooks-dir=./hooks main.py。
-
等待打包完成。
hook文件编写示例:
# hook-vispy.py
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
datas = collect_data_files('vispy')
hiddenimports = collect_submodules('vispy')
# hook-ansys.api.py
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
datas = collect_data_files('ansys.api')
hiddenimports = collect_submodules('ansys.api')
安装过程中会生成__pycache__
问题六:importlib.metadata.PackageNotFoundError
报错类型:
参考问题五,需要在packages里面找到依赖的模块具体包含哪些,然后编写hook文件,将这些模块都包含进去,不同之处是出现问题六的原因很可能是环境中存在类似pyansys_tools_versioning-0.5.0.dist-info这种包(含有dist-info字样)未被正确打包,需要在hook文件中添加这个文件夹下所有文件的路径,参考下面的方式。
from PyInstaller.utils.hooks import collect_submodules, collect_data_files
import os
# 收集 ansys.tools.versioning 的所有子模块
hiddenimports = collect_submodules('ansys.tools.versioning')
# 手动指定 ansys.tools.versioning 的数据文件路径
ansys_versioning_path = r"D:\python39\env\pyans_ui\Lib\site-packages\ansys\tools\versioning"
ansys_versioning_path1 = r"D:\python39\env\pyans_ui\Lib\site-packages\pyansys_tools_versioning-0.5.0.dist-info"
# 手动添加 ansys.tools.versioning 的元数据文件和其他数据
datas = [
(os.path.join(ansys_versioning_path, '__init__.py'), 'ansys/tools/versioning'),
(os.path.join(ansys_versioning_path, 'exceptions.py'), 'ansys/tools/versioning'),
(os.path.join(ansys_versioning_path, 'utils.py'), 'ansys/tools/versioning'),
(os.path.join(ansys_versioning_path1, 'INSTALLER'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'LICENSE'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'METADATA'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'RECORD'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'REQUESTED'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'WHEEL'), 'pyansys_tools_versioning-0.5.0.dist-info'),
(os.path.join(ansys_versioning_path1, 'direct_url.json'), 'pyansys_tools_versioning-0.5.0.dist-info'),
# 如果有其他相关数据文件,如文档、LICENSE等,也可以手动指定
]
问题七:解决 Pyinstaller 6.0.0版本后,打包oneDir时非exe文件被默认归纳到_internal 文件夹问题
自 Pyinstaller>=6.0.0 版本后,在打包 one dir(-D 目录模式)时,除可执行文件外,其余文件都将被转移到 _internal 文件夹下
解决方案:
降低pyinstaller版本,pyinstaller < 6.0.0
解决 Pyinstaller 6.0.0版本后,打包oneDir时非exe文件被默认归纳到_internal 文件夹问题
理解Python中的虚拟环境
另:查看CUDA成功配置的方法
(1)在cmd里,注意是配置cuda的环境,我这里是在pytorch环境中,所以要先激活pytorch环境。
(2)在python文件中输入
import torch
print(torch.cuda.is_available())
返回True说明配置好了。
之前安装CUDA和pytorch的参考
参考:
1:CUDA版本与显卡驱动版本对照表(更新至2022.10.26 - CUDA11.8)
2:查看已经安装的CUDA的版本
3:win10+Anaconda+pytorch+CUDA11.1 详细安装指南
4:【Pytorch】pytorch安装(包含cuda详细安装教程)
y i , j = ∑ m = 0 h − 1 ∑ n = 0 w − 1 ∑ k = 0 c − 1 w m , n , k x i + m , j + n , k + b y_{i,j}=\sum_{m=0}^{h-1}\sum_{n=0}^{w-1}\sum_{k=0}^{c-1}w_{m,n,k}x_{i+m,j+n,k}+b yi,j=∑m=0h−1∑n=0w−1∑k=0c−1wm,n,kxi+m,j+n,k+b