Pyinstaller打包Pytorch框架所遇到的问题
前言
第一次尝试用Pyinstaller打包Pytorch,碰见了很多问题,耗费了许多时间!想把这个过程中碰到的问题与解决方法记录一下,方便后来者。
基本流程
使用Pyinstaller打包流程可分为以下三步:
- 安装Pyinstaller,写个Hello world打包测试
- 打包整个项目,在本机上调试生成exe
- 将exe拷贝到新电脑上,测试和调试
一、安装Pyinstaller 和 测试Hello World
使用Pycharm打开项目,点击Terminal,输入以下命令:
pip install pyinstaller
请确保Terminal所在路径为项目根目录,以免在后续打包过程中找不到一些模块。图中红框内(pytorch)是我的项目所需要的虚拟环境。

编写Hello World测试,新建test.py:
if __name__ == '__main__':
print("Hello World!")
while True:
pass
在Terminal输入以下命令,打包test.py:
pyinstaller -F test.py
回车运行,开始打包!在文件夹dist中找到test.exe程序,运行测试,没报错说明Pyinstaller安装成功。
二、打包整个项目,在本机上调试生成exe
实际的项目一般是多文件,打包过程远比Hello World复杂多了。打包项目的核心要点有两个:
- 配置好.spec文件
- 补齐依赖项
关于.spec文件配置详见参考链接一,这里不再赘述。需要注意的是,在测试阶段,打包时应设置为-D模式,方便补齐dll。本文重点讲dll及其依赖项的补齐。先安装必备工具Dependens,通过这个工具,我们可以得到.dll文件所需要的依赖项。在运行打包后的exe常常遇到以下的问题:

这提示我们系统缺少caffe2_nvrtc.dll或其对应的依赖项。
- 先到对应路径查看caffe2_nvrtc.dll是否存在
- 若不存在,直接在Anaconda配置环境的文件夹搜索,一般都可以找到。将找到的caffe2_nvrtc.dll复制粘贴到根目录下
- 若存在,说明是缺少caffe2_nvrtc.dll的依赖项,使用Dependencies工具查看所需要的依赖项,后补齐到根目录下
Dependencies的使用非常简单,直接将.dll拖进去即可。这里以torch_python.dll举例

可以发现,缺少若干个dll文件,补齐便可。通过上述方法,依样画葫芦,基本可以解决关于dll报错的问题。
但每次重新打包后,需要手动复制粘贴dll文件,很是麻烦,通过配置.spec文件可简化操作。以记事本方式打开.spec,找到datas:

小括号内有两个路径,第一个路径'kernel32.dll'表示原始数据路径,存放kernel32.dll的路径;第二路径为'.'表示目标路径,打包后原始数据存放的路径。意思就是将第一路径的东西在打包后,放在第二路径上。需要注意的是,这边我设置的是相对路径,相对于.spec中的pathex

三、在新电脑上测试
我使用的是pytorch的GPU版本,在新电脑上运行发现会报如下错误,应该是缺少cuda库的缘故。

我的解决办法简单粗暴,直接拷贝cuda包到移动硬盘

每次到新的电脑,添加cuda到环境变量

建议在程序额外设置一个选项,可将网络切换成CPU推理,以便在其他电脑测试时,即使环境未配置成功,也可通过CPU推理验证打包成功与否。最后,祝大家好运,打包成功那一刻是蛮喜悦的!
参考资料
- python项目(非单一.py文件)用Pyinstaller打包发布成exe,在windos上运行程序
- 嘗試使用Pyinstaller打包yolov5中detect.py文件(含pytorch框架)所遇到的問題
- pyinstaller打包经验分享以及一些错误解决方法~~
- Dependencies安装链接
Pyinstaller打包Pytorch框架所遇到的问题的更多相关文章
- win10环境下pyinstaller打包pytorch遇到的问题及解决方案
pytorch-python源码生成windows的应用程序(.exe),报错OSError: could not get source code Failed to execute script h ...
- 用tkinter写出you-get下载器界面,并用pyinstaller打包成exe文件
本文为原创文章,转载请标明出处 一.you-get介绍 you-get是一个基于 python 3 的下载工具,使用 you-get 可以很轻松的下载到网络上的视频.图片及音乐.目前支持网易云音乐.A ...
- pyinstaller打包的exe太大?你需要嵌入式python玄学 探索篇
上篇我们讲到pip的安装以及普通库用pip的安装方法 CodingDog:pyinstaller打包的exe太大?你需要嵌入式python玄学 拓展篇zhuanlan.zhihu.com 问题纷沓而 ...
- 预测球队比赛结果及利用pyinstaller打包文件
一.预测乒乓球球队比赛成绩 1.乒乓球比赛规则 一局比赛:在一局比赛中,先得11分的一方为胜方:10平后,先多得2分的一方为胜方. 一场比赛:单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜 ...
- python3使用pyinstaller打包apscheduler出的错
本来只是想用Python做一个定时任务小工具在服务器上运行,可是服务器在隔离区,各种禁止上外网,使用pip导出列表那种下载库的方法不管用,导致Python的各种库都下不到,官网离线下载又各种缺依赖,好 ...
- PyInstaller打包步骤简记
pyinstaller 下载地址:http://www.pyinstaller.org/ 下载后用cmd进入解压文件夹 python setup.py install 安装. 最近用pyinstall ...
- pyinstaller打包第一个wxPython程序HelloWorld
pyinstaller 打包hello 7Mb ================= www.pyinstaller.org pip install pypiwin32 pip install pyin ...
- [python学习笔记] pyinstaller打包pyqt5程序无法运行
问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...
- pyinstaller 打包生成exe之后运行提示‘no module name 'xxx'’错误
python 3.7 pyinstaller 3.4 具体情况: pycharm中点击运行可成功执行,生成正确结果,没有报错. 双击run.py(程序运行的主文件),运行,可生成正确结果,没有报错. ...
随机推荐
- Java中Integer 和 int的区别
基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象 ...
- pycharm软件安装
目前热门的编程软件: 1.VScode 小巧轻便但是对小白不是很优化 2.sublime 时下最流行的代码编辑器,功能十分强大可以运行在windows.macOS和linux系统中,小白先不要使用 3 ...
- 羽夏闲谈—— C 语言入门之问
前言 最近加入了一个QQ频道,有很多想学C的纯小白.为什么这么说呢?因为他们会问一些环境用啥?为啥我配置不行?看了教程配置环境我也不会,咋配置?为啥这里代码这里有错误?啥语言好不好?诸如此类的问题 ...
- 利用DP-SSL对少量的标记样本进行有效的半监督学习
作者 | Doreen 01 介绍 深度学习之所以能在图像分类.自然语言处理等方面取得巨大成功的原因在于大量的训练数据得到了高质量的标注. 然而在一些极其复杂的场景(例如:无人驾驶)中会产生海量的数据 ...
- Nginx-反向代理服务器
概述 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 优点 nginx是多进程的,不会出现并发问题,不用加锁.一个进程出问题 ...
- 4.2 K8S超级完整安装配置
前言: 采坑 k8s有3种安装方式,如下所示: minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上 直接使用带有容器功能的云平台安装: ...
- 业务人员可以进行自助ETL操作?这款BI工具你值得拥有
ETL是什么? ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.E ...
- 从菜鸟到高手, HMS Core图像分割服务教你如何在复杂背景里精细抠图
2021年以来,自动驾驶赛道进入爆发期,该行业成为大厂以及初创企业的必争之地.其中众多公司都采用了计算机视觉作为自动驾驶的技术底座,通过图像分割技术,汽车才能够有效理解道路场景,分清楚哪里是路,哪里是 ...
- 【C#TAP 异步编程】构造函数 OOP
原文:异步 OOP 2:构造函数 (stephencleary.com) 异步构造带来了一个有趣的问题.能够在构造函数中使用会很有用,但这意味着构造函数必须返回一个表示将来将构造的值,而不是构造的值. ...
- 【windows 访问控制】十一、C# 实操 对象 System.Security.AccessControl 命名空间
AccessControl 命名空间 结构图 解说: DirectorySecurity=目录ACLFileSecurity=文件ACLFileSystemAuditRule=目录和文件中SACL中的 ...