網(wǎng)站首頁 編程語言 正文
前言
第一次嘗試用Pyinstaller打包Pytorch,碰見了很多問題,耗費了許多時間!想把這個過程中碰到的問題與解決方法記錄一下,方便后來者。
基本流程
使用Pyinstaller打包流程可分為以下三步:
- 安裝Pyinstaller,寫個Hello world打包測試
- 打包整個項目,在本機上調(diào)試生成exe
- 將exe拷貝到新電腦上,測試和調(diào)試
一、安裝Pyinstaller 和 測試Hello World
使用Pycharm打開項目,點擊Terminal,輸入以下命令:
pip install pyinstaller
請確保Terminal所在路徑為項目根目錄,以免在后續(xù)打包過程中找不到一些模塊。圖中紅框內(nèi)(pytorch)是我的項目所需要的虛擬環(huán)境。
編寫Hello World測試,新建test.py:
if __name__ == '__main__': print("Hello World!") while True: pass
在Terminal輸入以下命令,打包test.py:
pyinstaller -F test.py
回車運行,開始打包!在文件夾dist中找到test.exe程序,運行測試,沒報錯說明Pyinstaller安裝成功。
二、打包整個項目,在本機上調(diào)試生成exe
實際的項目一般是多文件,打包過程遠比Hello World復(fù)雜多了。打包項目的核心要點有兩個:
- 配置好.spec文件
- 補齊依賴項
關(guān)于.spec文件配置詳見參考鏈接一,這里不再贅述。需要注意的是,在測試階段,打包時應(yīng)設(shè)置為-D模式,方便補齊dll。本文重點講dll及其依賴項的補齊。先安裝必備工具Dependens,通過這個工具,我們可以得到.dll文件所需要的依賴項。在運行打包后的exe常常遇到以下的問題:
這提示我們系統(tǒng)缺少caffe2_nvrtc.dll或其對應(yīng)的依賴項。
- 先到對應(yīng)路徑查看caffe2_nvrtc.dll是否存在
- 若不存在,直接在Anaconda配置環(huán)境的文件夾搜索,一般都可以找到。將找到的caffe2_nvrtc.dll復(fù)制粘貼到根目錄下
- 若存在,說明是缺少caffe2_nvrtc.dll的依賴項,使用Dependencies工具查看所需要的依賴項,后補齊到根目錄下
Dependencies的使用非常簡單,直接將.dll拖進去即可。這里以torch_python.dll舉例
可以發(fā)現(xiàn),缺少若干個dll文件,補齊便可。通過上述方法,依樣畫葫蘆,基本可以解決關(guān)于dll報錯的問題。
??但每次重新打包后,需要手動復(fù)制粘貼dll文件,很是麻煩,通過配置.spec文件可簡化操作。以記事本方式打開.spec,找到datas:
小括號內(nèi)有兩個路徑,第一個路徑'kernel32.dll'表示原始數(shù)據(jù)路徑,存放kernel32.dll的路徑;第二路徑為'.'表示目標路徑,打包后原始數(shù)據(jù)存放的路徑。意思就是將第一路徑的東西在打包后,放在第二路徑上。需要注意的是,這邊我設(shè)置的是相對路徑,相對于.spec中的pathex
三、在新電腦上測試
我使用的是pytorch的GPU版本,在新電腦上運行發(fā)現(xiàn)會報如下錯誤,應(yīng)該是缺少cuda庫的緣故。
我的解決辦法簡單粗暴,直接拷貝cuda包到移動硬盤
每次到新的電腦,添加cuda到環(huán)境變量
建議在程序額外設(shè)置一個選項,可將網(wǎng)絡(luò)切換成CPU推理,以便在其他電腦測試時,即使環(huán)境未配置成功,也可通過CPU推理驗證打包成功與否。最后,祝大家好運,打包成功那一刻是蠻喜悅的!
參考資料
- python項目(非單一.py文件)用Pyinstaller打包發(fā)布成exe,在windos上運行程序
- pyinstaller打包經(jīng)驗分享以及一些錯誤解決方法~~
- Dependencies安裝鏈接
原文鏈接:https://www.cnblogs.com/Continue-i/p/16035187.html
相關(guān)推薦
- 2022-03-30 Android?Jetpack?Compose無限加載列表_Android
- 2022-09-20 Redis安全策略詳解_Redis
- 2022-07-10 理解setuid()、setgid()和sticky位
- 2022-06-22 使用pyinstaller打包.exe文件的詳細教程_python
- 2022-04-12 Redis?Server啟動過程的詳細步驟_Redis
- 2022-06-18 android自定義滾動上下回彈scollView_Android
- 2022-08-25 內(nèi)存泄露導(dǎo)致Android?中setVisibility()?失效原理_Android
- 2022-12-02 React函數(shù)式組件Hook中的useState函數(shù)的詳細解析_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支