最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用Pyinstaller如何打包整個項目

 更新時間:2022年11月29日 10:47:04   作者:Mabel-mql  
這篇文章主要介紹了python使用Pyinstaller如何打包整個項目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用Pyinstaller打包整個項目

今天真的被Pyinstaller給坑到了?。。?/p>

本文利用spec文件進行對整個項目進行打包,直接輸入命令打包也可以,但會出現(xiàn)比較多的問題。

1 .安裝Pyinstaller

pip install pyinstaller

2. 打開命令窗口

由于我這里是在Anaconda環(huán)境下創(chuàng)建的虛擬環(huán)境,因此要切換到對應的環(huán)境下,避免打包無關的包,同時切換到對于目錄下。

關于目錄,我這里是包含主文件、文件(各數(shù)據(jù)集的存放)以及同等級的py文件:

3. 生成 spec文件

執(zhí)行以下命令:

pyi-makespec -w xxx.py(xxx.py文件為要執(zhí)行的主文件,這里我是Insect_predict.py

4. 打開生成的spec文件

(這里是Insect_predict.spec),如下(一些需要自己添加:

#當出現(xiàn)出現(xiàn)"RecursionError: maximum recursion depth exceeded問題時,可能打包時出現(xiàn)了大量的遞歸超出了python預設的遞歸深度,需要添加如下三行。
import sys
import os.path as osp
sys.setrecursionlimit(5000)
#----------------------------------------------------------------
block_cipher = None

SETUP_DIR ='D:\\ssd-pytorch-mql\\'

#所有項目中的py文件路徑以列表形式寫入Analysis如下
#pathex定義了打包的主目錄,默認生成,只寫文件名
#當出現(xiàn)打包后執(zhí)行程序時出現(xiàn)類似No Module named xxx,可以將模塊填入到hiddenimports中
#excludes不要什么文件
#data將非py文件的路徑與存放的文件夾名寫在元組里

a = Analysis(
  ['Insect_predict.py',
   'ssd.py','summary.py','voc_annotation.py','get_map.py',
  'D:\\ssd-pytorch-mql\\nets\\mobilenetv2.py',
  'D:\\ssd-pytorch-mql\\nets\\ssd.py',
  'D:\\ssd-pytorch-mql\\nets\\ssd_training.py',
   'D:\\ssd-pytorch-mql\\nets\\vgg.py',
    'D:\\ssd-pytorch-mql\\utils\\anchors.py',
    'D:\\ssd-pytorch-mql\\utils\\callbacks.py',
    'D:\\ssd-pytorch-mql\\utils\\dataloader.py',
    'D:\\ssd-pytorch-mql\\utils\\utils.py',
    'D:\\ssd-pytorch-mql\\utils\\utils_bbox.py',
    'D:\\ssd-pytorch-mql\\utils\\utils_fit.py',
    'D:\\ssd-pytorch-mql\\utils\\utils_map.py'],
  pathex=['D:\ssd-pytorch-mql'],
  binaries=[],
  datas=[(SETUP_DIR+'model_data','model_data'),(SETUP_DIR+'VOCdevkit','VOCdevkit'),(SETUP_DIR+'img','img')],
  hiddenimports=[],
  hookspath=[],
  hooksconfig={},
  runtime_hooks=[],
  excludes=['zmq','pandas','tensorflow'],
  win_no_prefer_redirects=False,
  win_private_assemblies=False,
  cipher=block_cipher,
  noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
  pyz,
  a.scripts,
  [],
  exclude_binaries=True,
  name='Insect_predict',
  debug=False,
  bootloader_ignore_signals=False,
  strip=False,
  upx=True,
  console=False,
  disable_windowed_traceback=False,
  argv_emulation=False,
  target_arch=None,
  codesign_identity=None,
  entitlements_file=None,
)
coll = COLLECT(
  exe,
  a.binaries,
  a.zipfiles,
  a.datas,
  strip=False,
  upx=True,
  upx_exclude=[],
  name='Insect_predict',
)

以上內容是在生產(chǎn)spec文件后添加上去的,可根據(jù)自己文件內報錯進行修改。

5. 執(zhí)行spec文件,在命令行輸入

pyinstaller -D xxx.spec或pyinstaller xxx.spec(我的后者才可以運行)

6.生成中出現(xiàn)的問題

若生成中遇到如圖所示,即可在spec文件里面添加 excludes=[zmq]或出現(xiàn)lib not found…含有必要包的,可以將后面的路徑添加到系統(tǒng)環(huán)境變量當中,我的這樣是可以的,暫時還沒有遇到模塊的問題,如果有遇到可

以考慮是否版本問題:

當執(zhí)行完成會生產(chǎn)兩個文件夾dist和build,exe可執(zhí)行文件就在dist文件里面。

一步一步解決,總是可以的!??!

使用pyinstaller打包pytorch踩的那些坑

花費了點時間,終于在自己的電腦上搞定了pyinstaller的安裝并且讓它成功打包了一些小程序之后,嘗試著用它打包pytorch這樣的復雜程序,結果遇到的問題遠比想象中要多,于是記個筆記,也避免后來人踩坑。

問題1:單個文件打包還是文件夾打包?

用pyinstaller打包pytorch的感覺就是大,這文件真的大……已經(jīng)盡力用from import代替import之類的方式減少了導入的庫內容,但還是打包出了一個巨大無比的應用程序。

沒有使用upx壓縮的情況下,打包為文件夾需要3G,而打包為單個exe文件則是需要1.3G,怎么看好像都是打包成一個exe比較劃算的樣子……?

大錯特錯!

首先是啟動速度,打包為文件夾的情況下,啟動基本是秒啟動,但是打包為一整個exe文件,啟動就需要將近30s才能print出第一行提示語句……

其次,借著這次機會也正好了解了一下exe的運行機制,打包為整個exe文件之后,它每次運行都會把相當于整個文件夾的內容釋放到一個c盤的臨時文件夾中,而且它不會馬上刪除!

你問我為什么發(fā)現(xiàn)了這件事?因為試運行了幾次之后,我的C盤直接裂裂裂裂裂開了……

可憐弱小又無助的系統(tǒng)盤QvQ

經(jīng)過測試發(fā)現(xiàn),打包為整個文件夾的話,程序就會在當前路徑直接運行,而不會創(chuàng)造一個巨大無比的臨時文件在一次次運行中炸掉C盤,因此最后決定采用打包為一個文件夾的形式。

問題2:一起打包的數(shù)據(jù)文件找不到?

畢竟……是pytorch嘛,最終打包的肯定是只有測試模式的代碼,而不會把訓練模式的大段代碼都塞進exe里面,所以,希望把一個.pth的模型數(shù)據(jù)文件一起打包進去,這樣加載的網(wǎng)絡模型只要直接從模型里面讀數(shù)據(jù)就可以了。

很快,新的問題出現(xiàn)了,當把模型的路徑設置為當前路徑的時候,會出現(xiàn)一種非常詭異的情況:在本地計算機上運行正常,但是把整個打包好的文件夾放在別的電腦上運行的時候,它直接報錯說,找不到該文件!

你總不會是把絕對路徑給打包到exe里面去了吧???

好在查閱了一堆網(wǎng)絡資料后,發(fā)現(xiàn)這可能是運行路徑的問題,但是網(wǎng)上給出的寫法五花八門,大部分試了之后發(fā)現(xiàn)根本沒卵用, 另一個問題是,打包之后的文件夾過于雜亂,因此甚至想找到啟動程序的exe文件都需要滾輪往下滑好幾頁,尋思之后,干脆在整個文件夾外面寫一個.bat文件作為啟動腳本:

start 文件夾/啟動文件.exe

此時的目錄結構如圖所示:

|-測試工作區(qū)
    |-打包的整個項目文件夾
        |-打包后的數(shù)據(jù)文件
        |-打包后的啟動程序.exe
    |-用于啟動exe的腳本.bat

但是這又引出了新的問題:這個運行的路徑到底是臨時程序文件路徑,還是exe啟動程序路徑,還是bat腳本路徑???

我沒看懂,但我大受震撼.jpg

猜測半天不如進行實測,于是把網(wǎng)上五花八門的寫法都拉進來寫了個測試代碼打包到exe里面看看結果:

import os

print("當前程序路徑",os.getcwd(), os.path.exists(os.getcwd()+'\\'+G_model_path))
print("當前腳本路徑", sys.path[0], os.path.exists(sys.path[0]+'\\'+G_model_path))
print("當前默認所在路徑", os.path.abspath('.'), os.path.exists(os.path.abspath('.')+'\\'+G_model_path))
print('臨時執(zhí)行路徑',os.path.split(os.path.realpath(__file__))[0], os.path.exists(os.path.split(os.path.realpath(__file__))[0]+'\\'+G_model_path))

每一行都會顯示這種寫法得到的路徑信息,與能否在這條路徑上找到打包到文件夾里面的數(shù)據(jù)文件。

首先嘗試直接雙擊exe啟動,得到結果:

當前程序路徑 測試工作區(qū)\打包的整個項目文件夾 True
當前腳本路徑 測試工作區(qū)\打包的整個項目文件夾\base_library.zip False
當前默認所在路徑 測試工作區(qū)\打包的整個項目文件夾 True
臨時執(zhí)行路徑 測試工作區(qū)\打包的整個項目文件夾 True

然后試著用.bat啟動exe,得到結果:

當前程序路徑 測試工作區(qū) False
當前腳本路徑 測試工作區(qū)\打包的整個項目文件夾\base_library.zip False
當前默認所在路徑 測試工作區(qū) False
臨時執(zhí)行路徑 測試工作區(qū)\打包的整個項目文件夾 True

實踐出真知,全部測試之后的結果表明,sys.path[0]就是渣渣! 在直接雙擊運行exe的時候,有三種措施都能起效,但是通過bat運行exe的時候,只有最后一種寫法

os.path.split(os.path.realpath(__file__))[0]才能找到正確的數(shù)據(jù)文件所在路徑。

問題3:GPU訓練的模型要放到CPU環(huán)境跑?

這個問題相對來說比較簡單,只需要修改加載模型參數(shù)的代碼。

G_model.load_state_dict(load(G_model_path))

改為G_model.load_state_dict(load(G_model_path, map_location=device('cpu')))

問題4:直接打包還是用spec文件配置?

推薦先生成spec文件,完成配置后重新打包

然后在test.spec中修改參數(shù):

4.1 添加PYTHONPATH

如果你需要import項目根目錄中的文件夾作為庫,需要將文件夾路徑添加到該參數(shù)

必須用絕對路徑!相對路徑不生效!

pathex=['path']

4.2 添加數(shù)據(jù)文件

程序調用的相對路徑中的數(shù)據(jù)文件

datas=[(oldpath1, newpath1), (oldpath2, newpath2)]

4.3 手動添加沒有被識別到的調用庫

hiddenimports=['libs']

問題全部解決之后,程序運行正常√

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Flask請求數(shù)據(jù)獲取方法詳解

    Flask請求數(shù)據(jù)獲取方法詳解

    在 Flask 中,所有客戶端請求的數(shù)據(jù)都通過全局的 request 對象訪問,該對象是 請求上下文 的一部分,僅在請求處理期間存在,Flask 在收到請求時自動創(chuàng)建 request 對象,并根據(jù)請求類型和內容類型解析數(shù)據(jù),本文介紹了Flask請求數(shù)據(jù)獲取方法,需要的朋友可以參考下
    2025-04-04
  • python遍歷字典中的key和value方法

    python遍歷字典中的key和value方法

    本文從多個角度分析了Python如何遍歷字典中的key和value,包括使用for循環(huán)、items()方法、keys()方法、values()方法和列表推導式,通過本文的介紹,讀者可以更加深入地了解Python中遍歷字典的方法,需要的朋友可以參考下
    2023-09-09
  • 在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調用的方法

    在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調用的方法

    今天小編就為大家分享一篇在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調用的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Numpy將二維數(shù)組添加到空數(shù)組的實現(xiàn)

    Numpy將二維數(shù)組添加到空數(shù)組的實現(xiàn)

    今天小編就為大家分享一篇Numpy將二維數(shù)組添加到空數(shù)組的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • windows下python和pip安裝教程

    windows下python和pip安裝教程

    這篇文章主要為大家詳細介紹了windows下Python和pip安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • linux環(huán)境下安裝python虛擬環(huán)境及注意事項

    linux環(huán)境下安裝python虛擬環(huán)境及注意事項

    這篇文章主要介紹了linux環(huán)境下安裝python虛擬環(huán)境,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Python Django中間件使用原理及流程分析

    Python Django中間件使用原理及流程分析

    這篇文章主要介紹了Python Django中間件使用原理及流程分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Python多繼承原理與用法示例

    Python多繼承原理與用法示例

    這篇文章主要介紹了Python多繼承原理與用法,簡單描述了Python多繼承的相關概念、原理并結合實例形式分析了Python多繼承的具體定義、使用方法及相關操作注意事項,需要的朋友可以參考下
    2018-08-08
  • 使用python中的in ,not in來檢查元素是不是在列表中的方法

    使用python中的in ,not in來檢查元素是不是在列表中的方法

    今天小編就為大家分享一篇使用python中的in ,not in來檢查元素是不是在列表中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python lambda 匿名函數(shù)優(yōu)點和局限性深度總結

    Python lambda 匿名函數(shù)優(yōu)點和局限性深度總結

    這篇文章主要為大家介紹了Python lambda 匿名函數(shù)的優(yōu)點和局限性深度總結,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論

隆尧县| 郯城县| 河津市| 类乌齐县| 洪江市| 宕昌县| 阿拉善盟| 华蓥市| 平昌县| 通许县| 新丰县| 温州市| 星座| 溧水县| 罗平县| 会宁县| 成都市| 松潘县| 柯坪县| 义乌市| 东乌珠穆沁旗| 阳原县| 濉溪县| 临沭县| 玉树县| 新营市| 廉江市| 利津县| 天津市| 米脂县| 栾城县| 汾西县| 新郑市| 林西县| 杨浦区| 芦溪县| 塔河县| 沈丘县| 昭平县| 五家渠市| 荥阳市|