現象:
最近將pyinsatller升級到最新的 Version: 5.0.1版本后(之前一直用的是3.5版本同樣方法未遇到問題,今次更新到最新版本后5.0.1后打包就遇到問題,具體是這中間哪個版本開始有變化也不清楚了,也不去追究,凡是在新版本中遇到問題就在新版本中解決),詳細現象及解決辦法如下:
1, 先貼上pyinstaller的官方介紹:點擊跳轉
2,使用pyinstaller打包完成后到dist目錄下點擊 .exe程式運行時提示 “no module found”,凡是所有外部加載的模塊全部無法識別到,然后單獨將對應的包放到該dist目錄下再運行則問題消失,表明在打包時未正常對應目錄所依賴的模塊加載進去

3,先來看打包命令,我是使用批處理,跟 .py的主檔案(即可運行主視窗檔案)在同一目錄
@echo off echo Current Dish:%~d0 echo Current Dish and Path:%~dp0 echo Current CMD default Dir:"%cd%" set "current_dir=%~dp0" echo %current_dir% set "output_dir=%current_dir%" cd %output_dir% ;echo "%cd%" pyinstaller.exe -D -w %current_dir%\SmartTools.py -i %current_dir%\icon\Tool.ico pause
4,pyinstaller打包的時候會首先生成一個spec檔案,我們可以手工去修改這個檔案,下次打包指定用這個檔案,它的好處是:里面可以寫更復雜的選項,也可以重復利用,這個方法我是在pyinstaller 3.5版本中這么用的,但在pyinstaller5.0.1版本中卻會每次重新覆寫掉我所修改的spec檔案,導致該pathex每次為空,所以在打包時就不會將py檔案中所參考的檔案加載進去進行編輯打包,關于該pathex引數解釋可以到第一步的官方中去查找,下面我截圖出來給你們看(明確告訴我們該引數主要就是檔案中關于imports導模塊所需路徑)

5,那到這里就已經知道問題出在哪里了,但要如何處理才能將spec檔案中的pathex中帶上當前地址呢,上面也已經給出的明確的答案,就是在pyinstaller后面帶上 --paths引數,現修改編輯打包檔案如下(紅色字體為新增部分):
@echo off echo Current Dish:%~d0 echo Current Dish and Path:%~dp0 echo Current CMD default Dir:"%cd%" set "current_dir=%~dp0" echo %current_dir% set "output_dir=%current_dir%" cd %output_dir% ;echo "%cd%" pyinstaller.exe --paths %current_dir% -D -w %current_dir%\SmartTools.py -i %current_dir%\icon\Tool.ico pause
6,重新運行該批處理后再去檢查 spec檔案,查看pathex是否已經將對應目錄添加上,經確認該引數中已經有值了,為一個串列
1 # -*- mode: python ; coding: utf-8 -*- 2 3 4 block_cipher = None 5 6 7 a = Analysis( 8 ['E:\\SmartTools\\\\SmartTools.py'], 9 pathex=['E:\\SmartTools\\'], 10 binaries=[], 11 datas=[], 12 hiddenimports=[], 13 hookspath=[], 14 hooksconfig={}, 15 runtime_hooks=[], 16 excludes=[], 17 win_no_prefer_redirects=False, 18 win_private_assemblies=False, 19 cipher=block_cipher, 20 noarchive=False, 21 )
7, 重新到dist目錄下去執行 .exe程式,正常啟動未報任何錯誤,到此問題成功解決,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/472242.html
標籤:其他
上一篇:win7安裝MongoDB報錯的問題(基本所有該踩的坑都踩了)
下一篇:面向物件和面向程序的區別
