首頁 > 軟體

python非單一.py檔案用Pyinstaller打包釋出成exe

2022-03-25 13:01:24

一:背景以及專案結構介紹

第一次將自己做的python爬蟲專案打包成exe,搜了很多網上教學,大部分都是打包一個py檔案的小demo,這裡先給個笑臉吧,除了hello-world能去,其他真的屁用沒有。

先看一下我的專案層級結構,pycharm建立的專案用的虛擬python解析器,(不用原生的python直譯器是因為怕專案多了,環境會越來越亂),分了很多python package包{core包(專案入口py模組),docs包(有txt檔案等非原始碼資原始檔),logs包,test包,utils包),每個包模組單獨開發,並且會有不同包下模組之間的互相import的依賴關係,程式的入口時core包下的spider_main.py。

二:實施步驟

1:總體思路

整個步驟一共倆命令

(1)pyi-makespec -w xxx.py

      第一個命令用  pyi-makespec -w xxx.py  命令生成專案入口模組的spec檔案,然後對其自定義編輯,在簡約的spec檔案裡指定我們需要的資源,就比如要買房子並且裝修,我們現在有一些傢俱,比如沙發呀電視呀(原始碼),鍋碗瓢盆(非程式碼的資原始檔,比如txt檔案,png圖片等,專案中需要用到的)等,入口程式碼模組就是我們看中的這套房子的鑰匙,物業中介呢(pyinstaller)交付給我們一個樣板房(由入口模組生成的spec檔案)。樣板房現在設好了客廳,廚房,臥室等格局(spec檔案中不同的設定單元),具體在我們的客廳廚房臥室(不同的設定單元)放什麼就是我們根據房子裝修計劃(專案執行需要)去選擇。

pyi-makespec -w xxx.py

(2)pyinstaller -D xxx.spec

    第二個命令通過  pyinstaller -D xxx.spec   命令使用定義好的spec檔案(根據裝修計劃),生成完整專案的exe程式(裝修我們的房子)。

pyinstaller -D xxx.spec

2:安裝pyinstaller

       因為我用的是虛擬python直譯器,所以安裝pyinstaller要在專案虛擬Python環境空間,pycharm上點選最下面的Terminal,敲入命令 pip install pyinstaller 進行安裝。

pip install pyinstaller

3:具體步驟(以我專案為例子)

(1)生成spec檔案,並填充內容

執行命令:

pyi-makespec -w C:UsersadminPycharmProjectsspiderxiechengcar3venvIncludexiechengcar_spidercorespider_main.py

(直接用入口模組的絕對路徑)

pyi-makespec -w C:UsersadminPycharmProjectsspiderxiechengcar3venvIncludexiechengcar_spiderspider_main.py

先看一下剛生成的spec檔案都需要我們補充什麼內容吧,具體功能模組我搬過來了,放在圖下面介紹。

在看一下我補充好的spec檔案內容,聯絡我的專案層級結構作參考。

各個單元的作用。

a) py檔案打包設定

針對多目錄多檔案的python專案,打包時候需要將所有相關的py檔案輸入到Analysis類裡。Analysis類中的pathex定義了打包的主目錄,對於在此目錄下的py檔案可以只寫檔名不寫路徑。

b) 資原始檔打包設定

資原始檔包括打包的python專案使用的相關檔案,如圖示檔案,文字檔案等。對於此類資原始檔的打包需要設定Analysis的datas。

c)Hidden import設定

 pyinstaller在進行打包時,會解析打包的python檔案,自動尋找py原始檔的依賴模組。但是pyinstaller解析模組時可能會遺漏某些模組(not visible to the analysis phase),造成打包後執行程式時出現類似No Module named xxx。這時我們就需要在Analysis下hiddenimports中加入遺漏的模組。

(2):開始裝修房子(打包exe)。

通過第二個命令  pyinstaller -D xxx.spec(直接給個生成的spec檔案的絕對路徑,spec檔案生成在了Terminal代開的根目錄下)  打包成exe安裝包。

pyinstaller -D C:UsersadminPycharmProjectsspiderxiechengcar3spider_main.spec

(3):驗證exe

(a)檢視生成的內容

進入執行命令的根目錄,發現多了兩個資料夾:build 和 dist

build為臨時檔案目錄,裡面記錄了一些打包的錯誤資訊warn-xx.txt,如果是在找不到問題可以看兩眼.;dist中存放打包的結果,可執行檔案和其它程式執行的關聯檔案都在這個目錄下。

根目錄內容:

build目錄內容:

dist目錄內容:

(b):執行exe檔案(1:直接雙擊exe檔案 ;2:在cmd下,cd到當前目錄,輸入spider_main.exe 執行)

三:疑難雜症和需要注意的坑

1:打包找不到模組問題

進入了Terminal就要閒著沒事 cd 進後面的專案目錄了,比如開啟terminal之後預設位置是在 C:UsersadminPycharmProjectsspiderxiechengcar3 這個位置的,不要隨便進入 C:UsersadminPycharmProjectsspiderxiechengcar3venvIncludexiechengcar_spider 這個目錄下去執行命令,必須要在頂層目錄執行命令,不要問那個傻逼這麼閒還得cd到處看看,沒錯就是我,在打包的時候,pyinstaller才能找到目錄下的一些lib包和其他包下的具體依賴,如果依賴的東西模組不全,總會報no modle等錯誤,不管你怎麼填充spec檔案的datas列表都無濟於事,坑了我半天,頭髮都愁掉光了。

2:打包後,一直提示Failed to execute scrpt xxx問題

打包成功,但是沒有報任何錯誤,但是執行exe檔案時,總是會提示excute fail的錯誤,然後去看build的warn.txt檔案會提示各種miss的model資訊,不要去往這鑽牛角尖,這時候,你一是先檢查打包的路徑是不是專案的頂層目錄可以載入lib裡的其他依賴模組,二是編輯spec檔案,將exe單元下的console屬性改成True(預設是false)記得儲存,然後重新執行以下第二個命令,重新打包exe包之後,在cmd下執行exe執行檔案,這時候會出現報錯誤原因(如果不改spec這個欄位內容,無論是雙擊執行,還是cmd中執行,都只會彈出這個failed to excute的無頭腦error,別問頭為什麼知道,被坑出來的),根據提示來解決具體是缺少依賴模組原因還是程式碼中讀不到非程式碼資源(txt,png..),如果讀不到非程式碼資源,就根據提示的not found 的路徑,手動建立相關目錄,放上需要用到的檔案資源。

3:cmd下執行打包好的exe,執行一段時間卡主不動,按一下回車才繼續

原因:cmd跑exe的時候,在CMD快速編輯模式下,無意點到文字會選中文字,自動進入標記模式,並暫停程式,就得按任意鍵才能往下跑。

 解決方法:

(1):非查錯時避免cmd,採用雙擊exe檔案來執行

(2):將選中文字進入cmd的文字編輯模式取消

CMD 在執行Python 程式時,偶爾會暫停,也不報錯,按enter 可以繼續。

根本原因在於,在快速編輯模式下,無意點到文字會選中文字,自動進入標記模式,並暫停程式。

解決方法:

1. CMD 標題列右鍵

 2. 取消快速編輯(取消後 無法複製CMD中的文字)

4:其他注意事項

(1):程式進行打包exe的時候,最好把模組中的測試main函數註釋掉!

pyinstaller不會和python一樣,即使你用   if __name__ == '__main__':  表示出來了,pyinstall在匯入模組的時候,也會把你的main下的內容全部進行了編譯,所以人生建議,一定要註釋掉,如果再有路徑參照,那真是各種 file not found  問題層出不巧,讓你摸不到頭腦!不管你其他模組調沒呼叫!

(2)用windos powershell 執行你的exe程式的時候,程式結束,會報filenotfound問題,但是直接雙擊開啟exe或者pycharm執行就沒問題

讓你很疑惑:為什麼最後要去C槽找這個破東西息,而且哪怕裡面沒有寫入任何資料,但是他就是要這個檔案,例如我這個問題:因為我的log檔案的路徑是用的這個函數

os.path.dirname(os.path.dirname(__file__)) + '/docs/ipool.log'

在pycharm裡是獲取了當前的父目錄然後拼接成/docs 將log寫在了父目錄下的/docs/的ipool.log中,打包成exe的時候這個檔案是寫在distspider_mainIncludexiechengcar_spiderdocs 這裡,但是在windos powershell 裡面,當前的父目錄預設是在c:// 這裡,他就要找c://docsipool.log檔案,具體為什麼會在程式結束最後丟擲了這樣的路徑錯誤,我還是百思不得其解,知道其原因的網友希望能幫忙解答一下,對於這個問題經過測試三種方法,一是在它需要的這個目錄放一個這個的檔案,二是:直接雙擊exe來執行就好,程式執行完了,直接就關掉了,沒發現報這個錯,三:直接忽略掉,但是我不確定會不會影響專案結果。

 到此這篇關於python非單一.py檔案用Pyinstaller打包釋出成exe的文章就介紹到這了,更多相關Pyinstaller打包釋出成exe內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com