pyinstaller打包为.exe过程中的问题与解决方法

文章主要介绍了如何解决使用pyinstaller打包时遇到的.exe文件过大、与opencv-python版本不兼容、文件已存在警告以及UPX不可用的问题。通过创建和管理虚拟环境,调整库版本,以及对打包命令的修改,最终成功打包程序。同时,提到了检查CUDA配置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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等

参考:解决打包exe文件过大问题

问题二: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

报错类型:

  1. FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\ADMINI~1\AppData\Local\Temp\_MEI317882\ansys\api\mapdl\VERSION
  2. FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘C:\Users\ADMINI~1\AppData\Local\Temp\_MEI276362\vispy\glsl’
  3. FileNotFoundError: [Errno 2] No such file or directory: ‘F:\code\ui_submit\dist\main_ui\_internal\ansys\api\platform\instancemanagement\VERSION’

出现类似上述错误类型的原因是在运行打包的可执行文件时,程序试图从一个临时目录中读取文件,但该文件不存在。

解决方案:

  1. 定位文件: 在你的 Python 环境中,找到缺少文件的实际路径。根据错误提示,它可能位于…\Lib\site-packages\ansys\api.和…\Lib\site-packages\vispy\glsl.目录下。如果发现这些位置确实存在所需文件,可以进行下面的步骤,如果没有,说明环境中压根没有安装这些库,需要先安装。

  2. 在项目文件夹中新建一个hooks文件夹。

  3. 在hooks文件夹下手动编写hook文件,其实就是python文件,注意hook文件的命名需要与缺少的包的命名一致,可以查看后续的编写示例。

  4. 在控制台中将目录转移到当前项目文件夹下,用cd命令。

  5. 执行命令pyinstaller --clean --additional-hooks-dir=./hooks main.py。

  6. 等待打包完成。

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

报错类型:
importlib.metadata.PackageNotFoundError: pyansys-tools-versioning
参考问题五,需要在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中的虚拟环境

理解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=0h1n=0w1k=0c1wm,n,kxi+m,j+n,k+b

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值