使用pyinstaller 发布py文件为exe。遇到的问题总结(tensorflow,gpu)

本文汇总了使用PyInstaller进行Python项目打包时常见的错误及其解决方法,包括TensorFlow、pandas、PyWavelets等库的兼容性问题,以及如何处理UnicodeDecodeError、RecursionError等异常。

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

1,ModuleNotFoundError:No module named 'tensorflow.python._pywrap_tensorflow_internal.pyd'

参考:https://stackoverflow.com/questions/49620638/tensorflow-gpu-with-pyinstaller

修改dist下文件名:_pywrap_tensorflow_internal.pyd为tensorflow.python._pywrap_tensorflow_internal.pyd

(执行pyinstaller命令去掉 -F)若是生成一个文件

请参考:https://stackoverflow.com/questions/49732801/windows-10-pyinstaller-tensorflow-missing-modules/50580345

 

2,AttributeError: type object 'pandas._libs.tslibs.conversion._TSObject' has no attribute '__reduce_cython__'

参考:https://blog.youkuaiyun.com/Roanlys/article/details/80951185

参考:https://blog.youkuaiyun.com/qq_41185868/article/details/80601983

我的python 3.6.6  执行pip install pandas==0.20.0

上面是我遇到的问题。

 

3 utf-8错误

chcp 65001

 

完整命令:

在cpu版本下运行

代码加入

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"  
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

我的cuda 64 9.0

pyinstaller -F -c XXX_cpu.py --add-data tensorflow.python._pywrap_tensorflow_internal.pyd;. --add-data cudart64_90.dll;.

 

Windows安装pycocotools出现错误“cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp””的解决办法:

https://github.com/philferriere/cocoapi

 

 

参考:https://www.jianshu.com/p/b0e3a74ca97b

2.打包错误:ModuleNotFoundError: No module named 'setuptools._vendor'

更新 setuptools

 

pip install --upgrade setuptools

3.打包错误:AttributeError: module 'enum' has no attribute 'IntFlag'

卸载enum34包

 

pip uninstall enum34

4.运行错误:ImportError:No Module Nameed "pywt._extensions._cwt"

注意,以上的pywt._extensions._cwt可能是其他库

解决办法:

 

pyinstaller -F aaa.py --hidden-import pywt._extensions._cwt 

如果有多个库那就在在后面在加几个--hidden-import xxxx

5.运行错误:ModuleNotFoundError: No module named 'tensorflow.python._pywrap_tensorflow_internal'

使用tensorflow1.7以上版本会有这个问题

解决方法:

假如是文件夹生成模式生成的,比较简单,在生成的dist/[exe_name]/文件夹中,找到“_pywrap_tensorflow_internal.pyd”文件,剪切,在这个文件夹中新建一个tensorflow文件夹,并在tensorflow文件夹中新建一个python文件夹,将刚刚剪切的pyd文件黏贴到python文件夹中,再次运行exe,问题解决。

假如是单文件exe模式,可用以下方法,首先在python库文件夹中找到_pywrap_tensorflow_internal.pyd(懒得找就用文件夹模式生成一次,在exe所在的文件夹中就有),然后使用以下命令生成。

 

pyinstaller -F aaa.py --add-data="/path/to/the/pyd/_pywrap_tensorflow_internal.pyd;tensorflow/pyth

参考:
[1] https://blog.youkuaiyun.com/qq_39360343/article/details/82772916 setuptools问题
[2] https://blog.youkuaiyun.com/qq_15969343/article/details/84872743 enum问题
[3] https://blog.youkuaiyun.com/qq_40587575/article/details/86500445 pywt问题
[4] https://stackoverflow.com/questions/49620638/tensorflow-gpu-with-pyinstaller "_pywrap_tensorflow_internal"问题
[5] https://stackoverflow.com/questions/49732801/windows-10-pyinstaller-tensorflow-missing-modules?r=SearchResults 单文件"_pywrap_tensorflow_internal"问题

 

 

参考:https://blog.youkuaiyun.com/qq_20906467/article/details/108627021?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

1.RecursionError: maximum recursion depth exceeded

解决步骤:

1)pyinstaller -F xxx.py

​ 这一步肯定会报上述错误导致失败,但是会产生一个xxx.spec文件

2)在xxx.spec文件中增加两行(添加在原文件第二行):

import sys
sys.setrecursionlimit(5000)
  • 1
  • 2

3)pyinstaller xxx.spec

打包成功。

2.UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position

解决方法:在你打包的命令行中先输入chcp 65001 然后再输入打包命令。

3.WARNING: file already exists but should not: C:\…\…\…\Local\Temp_MEI58962\include\pyconfig.h

报错内容可能不同,但都是xxx已存在,问题的原因是pyinstaller打包时pyconfig.h多打了一次,所以会报已经存在了。这个解决方案就是把多余的pyconfig.h去掉。具体解决方法如下:

在自动生成的xxx.spec中,添加如下代码,去掉多余依赖项:

#add_begin
for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break
#add_end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

位置在a后面,pyz前面。

4.WARNING: file already exists but should not: C:\…\…\…\Local\Temp_MEI165842\torchvision_C.cp37-win_amd64.pyd

这个试了挺多办法,还未解决,有解决了的大哥麻烦告知一下,感激不尽!!!

5.最麻烦的,torch和torchvision打包问题,exe在自己电脑上能用,在其他电脑上就报错如下:

其实主要问题是pyinstaller不支持torchvision在0.3.0以上的版本。但是,要给torchvision降级什么的·····不多说了,懂的都懂!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rT1z876E-1600249368225)(https://user-images.githubusercontent.com/34004152/74804720-5e0c1680-5324-11ea-8974-ce18e0692b42.png)]

所以,真解决方案:在GitHub上找到了大佬的解决方法:

这里详细说一下:在主文件,也就是你要打包的文件头部添加

def script_method(fn, _rcb=None):
    return fn
def script(obj, optimize=True, _frames_up=0, _rcb=None):
    return obj
import torch.jit
torch.jit.script_method = script_method
torch.jit.script = script
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不过记得添加在import torch后面,否则会报错。

有的可能在这一步就好了,但是,可能会发现打包出来的exe文件没有变大,因为torch和torchvision之类的库并没有打包进exe,于是在其他电脑上运行依然报错。这里就要修改spec文件了,在a = Analysis里修改path和hiddenimports:

datas=[(path.join(site_packages,"torch"), "torch"),
                (path.join(site_packages,"torchvision"), "torchvision"),
                (path.join(site_packages,"cv2"), "cv2")],
             hiddenimports=['torch', 'torchvision', 'cv2'],
  • 1
  • 2
  • 3
  • 4

这里我的site_packages在"F:\Anaconda3\Lib\site-packages",即自己电脑anaconda里的拓展库位置。

其实这不可能也不行,但是这时候我正好注意到了pyinstaller xxx.spec时所报的信息:

image-20200916172325903

注意到那一堆warning没,这张图是没问题的图,这些warning暂时没发现有啥影响,但在之前还有其他warning的,是torch和torchvision报的,也是缺少dll,不过这些dll在电脑上其实都有,只是pyinstaller太蠢了,找不到,都在"site-packages"里,把他们一个个找到复制到要打包文件目录就行了,我这里需要的文件如下图:

image-20200916172719088

这些dll都是我一个个搜索,然后复制过来的,每个人的torch和torchvision版本都可能不一样,大家各找各的就行了。

顺带一提,我的环境是:

cuda = 10.0
torch = 1.1.0
torchvision = 0.3.0
  • 1
  • 2
  • 3

这样应该就么得问题了,我看见有人OpenCV打包也遇到类似问题,我这里也收集一下解决方法:

首先也是把opencv_videoio_ffmpeg430_64.dll复制到主文件夹下,这个也是每个人的版本都不一样的,然后在主代码里加上一段:

import ctypes

try:
    temp = ctypes.windll.LoadLibrary('opencv_videoio_ffmpeg430_64.dll')

except:
    pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

应该就好了。

是不是以为完了????????

我还遇见其他问题了,,,,

因为我需要用到mmcv这个库,但它只要一打包就绝对出问题,,,

image-20200916173610493

顺藤摸瓜,File “setuptools\depends.py”, line 6, 在这里,我们进去看看:

image-20200916173717746

长得不咋地,,,挺能折腾我。

是因为绝对路径问题吧,好像pyinstaller可以冻结路径,懒得搞了,改成这样子就行了,不过事后记得改回来,不然在自己电脑上以后可能会报错!!!!

from py33compat import Bytecode
from py27compat import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
import py27compat
  • 1
  • 2
  • 3

到这里就告一段落了,如果有类似问题可以给我留言,万一我那天想起这个账号了随手登录看见了可以一起讨论下!

 


--------------------- 
作者:dreamflywhere 
来源:优快云 
原文:https://blog.youkuaiyun.com/dreamFlyWhere/article/details/82463902?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>首先,用户的问题是:“我想了解为什么模型文件是.onnx后缀而不是.py文件,可能需要解释ONNX格式的作用和优势。请问onnx模型文件py文件的区别以及onnx格式的作用”。所以,我需要解释ONNX模型文件与.py文件的区别,以及ONNX格式的作用和优势。根据系统指令:-所有行内数学表达式使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,如[^1]。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用。站内引用提供了相关信息:-引用[1]:解释了如何将PyTorch模型导出为ONNX文件,强调跨框架迁移。-引用[2]:展示了如何读取ONNX文件并打印节点。-引用[3]:讨论了在PyInstaller打包时处理ONNX文件路径的问题。-引用[4]:详细描述了ONNX文件的结构,包括graph、node、initializer等。我需要整合这些信息来回答用户的问题。关键点:-**.py文件vs.onnx文件**:-.py文件Python脚本文件,包含源代码,定义了模型的结构和逻辑。-.onnx文件是二进制文件,存储了训练好的模型的参数和计算图,不包含源代码。-**ONNX格式的作用**:-ONNX(OpenNeuralNetworkExchange)是一个开放格式,用于表示深度学习模型。-它允许模型在不同框架(如PyTorch、TensorFlow)之间迁移。-优势:标准化、跨平台兼容性、易于部署和推理。-**区别**:-.py文件是可编辑的、人类可读的代码;.onnx文件是序列化的、机器可读的模型表示。-.py文件需要Python环境运行;.onnx文件可以被各种支持ONNX的推理引擎加载。-**作用和优势**:-作用:促进模型共享、简化部署、支持硬件加速。-优势:减少框架依赖、提高效率、便于优化。结构清晰的回答:1.**引言**:简要介绍问题。2.**解释区别**:比较.py和.onnx文件。3.**解释ONNX格式的作用**:详细说明其目的和好处。4.**优势总结**:列出关键优势。5.**生成相关问题**:基于内容生成相关问题。生成相关问题:-如系统指令示例,在最后添加“§§相关问题§§”部分。引用标识:-在回答中自然地引用站内内容。例如,提到导出ONNX文件时引用[^1],提到ONNX结构时引用[^4]。确保使用中文回答。数学表达式:用户问题中没有明显的数学内容,但如果有涉及,如模型参数等,使用行内格式。最终回答结构:-开头:直接回答用户问题。-主体:逐步解释。-结尾:相关问题。</think>### ONNX模型文件与.py文件的区别及ONNX格式的作用 用户的问题聚焦于为什么模型文件使用.onnx后缀而非.py文件,以及ONNX格式的作用和优势。我将逐步解释,确保内容清晰可靠。以下基于深度学习模型开发和部署的实践,结合ONNX(Open Neural Network Exchange)标准进行说明。ONNX是一个开放格式,旨在解决深度学习模型在不同框架和平台间的兼容性问题。 #### 1. **.py文件与.onnx文件的本质区别** - **.py文件**: - 这是Python源代码文件,包含模型的定义、训练逻辑和依赖库调用(如使用PyTorch或TensorFlow)。 - 例如,在PyTorch中,一个简单的线性模型可能定义在.py文件中: ```python import torch.nn as nn class SimpleModel(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(10, 5) def forward(self, x): return self.fc(x) ``` - **特点**:人类可读、可编辑、需要特定框架(如PyTorch)和Python环境执行。它表示模型的“蓝图”,但未包含训练后的权重或优化后的计算图。 - **.onnx文件**: - 这是一个二进制文件,存储了模型的完整计算图(graph)、权重参数(weights)、输入输出定义等,采用标准化的序列化格式。 - 例如,引用[1]展示了如何将PyTorch模型导出为ONNX文件: ```python torch.onnx.export(model, dummy_input, "simple_model.onnx", verbose=True) ``` - **特点**:机器可读、不可编辑(需专用工具解析)、独立于原始框架。它表示模型的“快照”,包括所有推理所需的元素,但不包含训练代码或框架依赖。 - **核心区别总结**: - | 属性 | .py文件 | .onnx文件 | |--------------|----------------------------------|-----------------------------------| | **内容** | 源代码和逻辑定义 | 计算图、权重和元数据 | | **可读性** | 人类可读(文本) | 机器可读(二进制,需工具可视化) | | **依赖性** | 需要Python和特定框架环境 | 跨框架兼容,仅需ONNX运行时 | | **用途** | 开发、训练和调试 | 部署、推理和跨平台迁移 | - 简单来说,.py文件是“创建模型的过程”,而.onnx文件是“模型本身的产品化表示”。 #### 2. **ONNX格式的作用和优势** ONNX格式的核心作用是实现深度学习模型的**标准化和互操作性**。以下是详细解释: - **作用**: - **跨框架迁移**:ONNX允许模型从一个框架(如PyTorch)导出,并在另一个框架(如TensorFlow)或推理引擎(如ONNX Runtime)中加载。这解决了框架锁定(framework lock-in)问题,引用[1]强调:“导出的ONNX文件可以在不同的深度学习框架中加载和使用,实现模型的跨框架迁移”[^1]。 - **统一表示**:ONNX将模型抽象为一个计算图(graph),包含节点(node)、输入输出(input/output)和权重(initializer)。引用[4]详细描述了结构:`model.graph`存储节点连接关系,`model.graph.initializer`保存权重数据,`model.graph.input`和`model.graph.output`定义模型的输入输出[^4]。这使得模型可以表示为数学表达式,例如一个简单的线性层:$y = Wx + b$,其中$W$和$b$是权重参数。 - **部署优化**:ONNX文件可直接用于生产环境,支持硬件加速(如GPU、TPU)。引用[3]提到,在打包应用时(如用PyInstaller),ONNX文件路径处理简化了部署:“为了保证正确读取,在py代码中修改读取文件的路径”[^3]。 - **优势**: 1. **标准化和兼容性**:ONNX是开放标准,被主流框架(PyTorch、TensorFlow等)和硬件厂商支持。这避免了为每个平台重写模型。 2. **高效推理**:ONNX运行时(ONNX Runtime)针对推理优化,比原始框架更快、内存占用更低。例如,在边缘设备上部署时,ONNX文件可减少依赖。 3. **易于可视化和调试**:工具如Netron(引用[2])可可视化ONNX计算图,帮助开发者理解模型结构。虽然Netron不显示节点顺序,但通过代码(如`print(model.graph.node)`)可解析细节[^2]。 4. **安全性和可移植性**:作为二进制文件,.onnx文件不暴露源代码,适合商业部署。同时,它独立于Python环境,可在C++、Java等语言中加载。 5. **模型优化支持**:ONNX支持量化(quantization)、图优化等技术,提升推理性能,尤其适合资源受限场景。 - **为什么使用.onnx而非.py?** - 在部署阶段,.py文件需要完整的训练环境和框架,增加了复杂性和开销。而ONNX文件提供轻量化的“冻结”模型,便于集成到Web服务、移动App或嵌入式系统中。例如,导出为ONNX后,模型推理无需Python解释器,只需几MB的ONNX运行时。 - 数学上,ONNX将模型表示为计算图$G = (V, E)$,其中$V$是节点(操作如卷积或激活函数),$E$是边(数据流)。这确保了高效执行,而.py文件只定义$G$的生成逻辑。 #### 3. **实际应用示例** 假设您在PyTorch中训练了一个模型: - **开发阶段**:使用.py文件定义和训练模型。 - **部署阶段**:导出为ONNX文件(如`model.onnx`),然后在推理引擎中加载: ```python import onnxruntime as ort session = ort.InferenceSession("model.onnx") inputs = {"input_name": input_data} outputs = session.run(None, inputs) ``` 这消除了对PyTorch的依赖,提升效率。 综上所述,ONNX格式解决了模型碎片化问题,其优势在于标准化、跨平台和高效部署。而.py文件适用于开发,但不利于生产环境。如果您有具体场景(如导出错误),我可以进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值