python非單一.py文件用Pyinstaller打包發(fā)布成exe
一:背景以及項目結(jié)構(gòu)介紹
第一次將自己做的python爬蟲項目打包成exe,搜了很多網(wǎng)上教程,大部分都是打包一個py文件的小demo,這里先給個笑臉吧,除了hello-world能去,其他真的屁用沒有。
先看一下我的項目層級結(jié)構(gòu),pycharm建立的項目用的虛擬python解析器,(不用本地的python解釋器是因為怕項目多了,環(huán)境會越來越亂),分了很多python package包{core包(項目入口py模塊),docs包(有txt文件等非源代碼資源文件),logs包,test包,utils包),每個包模塊單獨開發(fā),并且會有不同包下模塊之間的互相import的依賴關(guān)系,程序的入口時core包下的spider_main.py。
二:實施步驟
1:總體思路
整個步驟一共倆命令
(1)pyi-makespec -w xxx.py
第一個命令用 pyi-makespec -w xxx.py 命令生成項目入口模塊的spec文件,然后對其自定義編輯,在簡約的spec文件里指定我們需要的資源,就比如要買房子并且裝修,我們現(xiàn)在有一些家具,比如沙發(fā)呀電視呀(源代碼),鍋碗瓢盆(非代碼的資源文件,比如txt文檔,png圖片等,項目中需要用到的)等,入口代碼模塊就是我們看中的這套房子的鑰匙,物業(yè)中介呢(pyinstaller)交付給我們一個樣板房(由入口模塊生成的spec文件)。樣板房現(xiàn)在設好了客廳,廚房,臥室等格局(spec文件中不同的配置單元),具體在我們的客廳廚房臥室(不同的配置單元)放什么就是我們根據(jù)房子裝修計劃(項目執(zhí)行需要)去選擇。
pyi-makespec -w xxx.py
(2)pyinstaller -D xxx.spec
第二個命令通過 pyinstaller -D xxx.spec 命令使用定義好的spec文件(根據(jù)裝修計劃),生成完整項目的exe程序(裝修我們的房子)。
pyinstaller -D xxx.spec
2:安裝pyinstaller
因為我用的是虛擬python解釋器,所以安裝pyinstaller要在項目虛擬Python環(huán)境空間,pycharm上點擊最下面的Terminal,敲入命令 pip install pyinstaller 進行安裝。
pip install pyinstaller
3:具體步驟(以我項目為例子)
(1)生成spec文件,并填充內(nèi)容
執(zhí)行命令:
pyi-makespec -w C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider\core\spider_main.py
(直接用入口模塊的絕對路徑)
pyi-makespec -w C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider\spider_main.py
先看一下剛生成的spec文件都需要我們補充什么內(nèi)容吧,具體功能模塊我搬過來了,放在圖下面介紹。
在看一下我補充好的spec文件內(nèi)容,聯(lián)系我的項目層級結(jié)構(gòu)作參考。
各個單元的作用。
a) py文件打包配置
針對多目錄多文件的python項目,打包時候需要將所有相關(guān)的py文件輸入到Analysis類里。Analysis類中的pathex定義了打包的主目錄,對于在此目錄下的py文件可以只寫文件名不寫路徑。
b) 資源文件打包配置
資源文件包括打包的python項目使用的相關(guān)文件,如圖標文件,文本文件等。對于此類資源文件的打包需要設置Analysis的datas。
c)Hidden import配置
pyinstaller在進行打包時,會解析打包的python文件,自動尋找py源文件的依賴模塊。但是pyinstaller解析模塊時可能會遺漏某些模塊(not visible to the analysis phase),造成打包后執(zhí)行程序時出現(xiàn)類似No Module named xxx。這時我們就需要在Analysis下hiddenimports中加入遺漏的模塊。
(2):開始裝修房子(打包exe)。
通過第二個命令 pyinstaller -D xxx.spec(直接給個生成的spec文件的絕對路徑,spec文件生成在了Terminal代開的根目錄下) 打包成exe安裝包。
pyinstaller -D C:\Users\admin\PycharmProjects\spider\xiechengcar3\spider_main.spec
(3):驗證exe
(a)查看生成的內(nèi)容,
進入執(zhí)行命令的根目錄,發(fā)現(xiàn)多了兩個文件夾:build 和 dist
build為臨時文件目錄,里面記錄了一些打包的錯誤信息warn-xx.txt,如果是在找不到問題可以看兩眼.;dist中存放打包的結(jié)果,可執(zhí)行文件和其它程序運行的關(guān)聯(lián)文件都在這個目錄下。
根目錄內(nèi)容:
build目錄內(nèi)容:
dist目錄內(nèi)容:
(b):運行exe文件(1:直接雙擊exe文件 ;2:在cmd下,cd到當前目錄,輸入spider_main.exe 運行)
三:疑難雜癥和需要注意的坑
1:打包找不到模塊問題
進入了Terminal就要閑著沒事 cd 進后面的項目目錄了,比如打開terminal之后默認位置是在 C:\Users\admin\PycharmProjects\spider\xiechengcar3 這個位置的,不要隨便進入 C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider 這個目錄下去執(zhí)行命令,必須要在頂層目錄執(zhí)行命令,不要問那個傻逼這么閑還得cd到處看看,沒錯就是我,在打包的時候,pyinstaller才能找到目錄下的一些lib包和其他包下的具體依賴,如果依賴的東西模塊不全,總會報no modle等錯誤,不管你怎么填充spec文件的datas列表都無濟于事,坑了我半天,頭發(fā)都愁掉光了。
2:打包后,一直提示Failed to execute scrpt xxx問題
打包成功,但是沒有報任何錯誤,但是運行exe文件時,總是會提示excute fail的錯誤,然后去看build的warn.txt文檔會提示各種miss的model信息,不要去往這鉆牛角尖,這時候,你一是先檢查打包的路徑是不是項目的頂層目錄可以加載lib里的其他依賴模塊,二是編輯spec文件,將exe單元下的console屬性改成True(默認是false)記得保存,然后重新執(zhí)行以下第二個命令,重新打包exe包之后,在cmd下運行exe執(zhí)行文件,這時候會出現(xiàn)報錯誤原因(如果不改spec這個字段內(nèi)容,無論是雙擊運行,還是cmd中運行,都只會彈出這個failed to excute的無頭腦error,別問頭為什么知道,被坑出來的),根據(jù)提示來解決具體是缺少依賴模塊原因還是代碼中讀不到非代碼資源(txt,png..),如果讀不到非代碼資源,就根據(jù)提示的not found 的路徑,手動建立相關(guān)目錄,放上需要用到的文檔資源。
3:cmd下運行打包好的exe,運行一段時間卡主不動,按一下回車才繼續(xù)
原因:cmd跑exe的時候,在CMD快速編輯模式下,無意點到文字會選中文字,自動進入標記模式,并暫停程序,就得按任意鍵才能往下跑。
解決方法:
(1):非查錯時避免cmd,采用雙擊exe文件來執(zhí)行
(2):將選中文本進入cmd的文本編輯模式取消
CMD 在運行Python 程序時,偶爾會暫停,也不報錯,按enter 可以繼續(xù)。
根本原因在于,在快速編輯模式下,無意點到文字會選中文字,自動進入標記模式,并暫停程序。
解決方法:
1. CMD 標題欄右鍵
2. 取消快速編輯(取消后 無法復制CMD中的文字)
4:其他注意事項
(1):程序進行打包exe的時候,最好把模塊中的測試main函數(shù)注釋掉!
pyinstaller不會和python一樣,即使你用 if __name__ == '__main__': 表示出來了,pyinstall在導入模塊的時候,也會把你的main下的內(nèi)容全部進行了編譯,所以人生建議,一定要注釋掉,如果再有路徑引用,那真是各種 file not found 問題層出不巧,讓你摸不到頭腦!不管你其他模塊調(diào)沒調(diào)用!
(2)用windos powershell 運行你的exe程序的時候,程序結(jié)束,會報filenotfound問題,但是直接雙擊打開exe或者pycharm運行就沒問題
讓你很疑惑:為什么最后要去c盤找這個破東西息,而且哪怕里面沒有寫入任何數(shù)據(jù),但是他就是要這個文件,例如我這個問題:因為我的log文件的路徑是用的這個函數(shù)
os.path.dirname(os.path.dirname(__file__)) + '/docs/ipool.log'
在pycharm里是獲取了當前的父目錄然后拼接成/docs 將log寫在了父目錄下的/docs/的ipool.log中,打包成exe的時候這個文件是寫在dist\spider_main\Include\xiechengcar_spider\docs
這里,但是在windos powershell 里面,當前的父目錄默認是在c:// 這里,他就要找c://docsipool.log文件,具體為什么會在程序結(jié)束最后拋出了這樣的路徑錯誤,我還是百思不得其解,知道其原因的網(wǎng)友希望能幫忙解答一下,對于這個問題經(jīng)過測試三種方法,一是在它需要的這個目錄放一個這個的文件,二是:直接雙擊exe來執(zhí)行就好,程序運行完了,直接就關(guān)掉了,沒發(fā)現(xiàn)報這個錯,三:直接忽略掉,但是我不確定會不會影響項目結(jié)果。
到此這篇關(guān)于python非單一.py文件用Pyinstaller打包發(fā)布成exe的文章就介紹到這了,更多相關(guān)Pyinstaller打包發(fā)布成exe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PyInstaller?完美打包?Python?腳本
- pyinstaller將python程序打包為可執(zhí)行文件
- 如何使用pyinstaller打包多個和單個python文件詳解
- 使用PyInstaller庫把Python程序打包成exe
- Pyinstaller+Pipenv打包Python文件的實現(xiàn)示例
- 用python打包exe應用程序及PyInstaller安裝方式
- python之pyinstaller組件打包命令和異常解析實戰(zhàn)
- 教你使用pyinstaller打包Python教程
- 如何利用pyinstaller打包Python程序為exe可執(zhí)行文件
- python打包pyinstall的實現(xiàn)步驟
相關(guān)文章
Python+Kepler.gl實現(xiàn)時間輪播地圖過程解析
這篇文章主要介紹了Python+Kepler.gl實現(xiàn)時間輪播地圖過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07pandas庫之DataFrame滑動窗口的實現(xiàn)
本文主要介紹了pandas庫之DataFrame滑動窗口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03Python3.5.3下配置opencv3.2.0的操作方法
下面小編就為大家分享一篇Python3.5.3下配置opencv3.2.0的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python通過樸素貝葉斯和LSTM分別實現(xiàn)新聞文本分類
樸素貝葉斯法(Naive Bayes model)是基于貝葉斯定理與特征條件獨立假設的分類方法。LSTM則是一種時間循環(huán)神經(jīng)網(wǎng)絡,適合于處理和預測時間序列中間隔和延遲相對較長的重要事件。本文將通過這兩個方法分別實現(xiàn)新聞文本分類,需要的可以參考一下2021-12-12Python中的協(xié)程(Coroutine)操作模塊(greenlet、gevent)
這篇文章介紹了Python中的協(xié)程(Coroutine)操作模塊(greenlet、gevent),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05Python3 利用face_recognition實現(xiàn)人臉識別的方法
這篇文章主要介紹了Python3 利用face_recognition實現(xiàn)人臉識別的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03