在使用python開發一些小工具時,如果其他人電腦中沒有python環境或者沒有安裝相應的第三方庫,是沒辦法運行的,而要求對方安裝又不現實,尤其是對方不是技術人員,因此如何將一個獨立的python程式,使它成為成為一個不用考慮環境,雙擊即可運行的桌面應用呢?使用pyinstaller打包是一個不錯的... ...
1 背景
在使用python開發一些小工具時,如果其他人電腦中沒有python環境或者沒有安裝相應的第三方庫,是沒辦法運行的,而要求對方安裝又不現實,尤其是對方不是技術人員,因此如何將一個獨立的python程式,使它成為成為一個不用考慮環境,雙擊即可運行的桌面應用呢?使用pyinstaller打包是一個不錯的選擇。
2 什麼是pyinstaller
pyinstaller是一個支持跨平臺使用的第三方庫,它可以將腳本執行所需的模塊和庫,自動分析、收集並生成一個文件夾或者可執行文件。
以下示例使用windows環境,由於pyinstaller的跨平臺性,與類unix環境命令一樣,只是最終生成的可執行文件不一樣。
3 如何安裝
安裝pyinstaller模塊與安裝其他python模塊一樣,使用pip命令安裝即可。
pip install pyinstaller
安裝輸出結果:
其中的 altgraph、future等代表 PyInstaller 模塊依賴環境。
4 如何使用
4.1 常用命令介紹
pyinstaller + 選項 + python入口源文件
主要選項包括:
- -F 打包成一個exe文件(如果是多個py文件,下麵有解決辦法)
- -D 自動創建一個包含桌面應用文件的目錄,包括所有運行依賴文件(預設選項)
- -w 指定程式運行時,不顯示命令行視窗(僅對windows有效)
- -i + ico路徑 可以更換應用圖標(如果是當前文件夾下,不用添加ico路徑)
- -d 產生debug版本的exe文件
- -o 指定.spec文件生成目錄,如果沒有指定,將會在當前根目錄下輸出
- -n 指定.spec文件名字,如果省略,主文件名將作為.spec的文件名字
- -p 設置導入路徑,可以使用路徑分隔符(windows是分號,類unix是冒號)
4.2 常用方式舉例
4.2.1 打包成單個文件
使用以下命令將會使python腳本,打包成為一個exe文件。
pyinstaller -F -w -i “./dian_128.ico” start_dian.py
其中:
- -F 命令打包成單個文件
- -w 無命令行視窗
- -i 指定exe文件icon圖標
執行成功後,將會在根目錄生成兩個文件夾,其中“build”文件中包含的是所有依賴文件,“dist”文件夾中存放著本次生成的exe文件。
4.2.2 打包成文件夾
使用以下命令將會使python腳本,打包成為一個文件夾。
pyinstaller -D -w -i “./dian_128.ico” start_dian.py
其中:
- -D 命令打包成一個文件夾
- -w 無命令行視窗
- -i 指定exe文件icon圖標
命令行執行成功後,將會在dist目錄下生成一個start_dian的子目錄,該目錄中包含了大量的.dll文件和.pyz文件,都是exe文件的支撐文件。
4.3 使用.spec文件配置編譯
上面講解的都是通用版本,不太靈活,如果想要加入新的資源,或每次編譯不想輸入很長的命令,可以使用.spec文件,進行定製化配置編譯。
4.3.1 生成.spec文件
使用上面的方式進行編譯後,如未指定.spec生成目錄,會在當前根目錄生成一個與編譯py文件同名的.spec文件;
或使用命令pyi-makespec -F start_dian.py,將會直接生成.spec文件;
4.3.2 spec文件內容介紹
打開spec文件
這裡僅對涉及到的幾個關鍵變數進行解釋:
1.Analysis:
- [‘start_dian.py’]:是主文件以及全部依賴文件,如果依賴文件都在同一目錄下可以不寫;
- oathex:項目的絕對路徑;
- datas:添加資源文件,例如文件夾、圖片、excel等等,以元組入參,第一個參數為原始路徑,第二個參數為編譯後的目標路徑;
2.EXE:
- console:是否開啟命令行,預設為True(開啟);
- icon:編譯出exe可執行文件產物的圖標,必須使用絕對路徑;
- name:EXE內和COLLECT內的name都是編譯後的文件名,預設與編譯主文件同名;
4.3.3 spec文件編譯
配置好的spec文件,執行命令進行編譯,不再需要其他參數:
pyinstaller start_dian.spec
4.3.4 以下四種情況,修改spec文件比較好:
- 當您需要將資源文件與exe文件捆綁在一起時;
- 當您的依賴文件包括.dll或.so文件時;
- 當您運行exe需要運行參數時;
- 當您需要合併多程式包成為通用模塊時;
5 常見問題
1.多文件如何打包
- 在.spec文件中Analysis參數hiddenimports中添加導入模塊名稱,修改後,可再次進行打包,將會解決exe文件依賴包找不到的問題;
- 在命令中使用-p 主文件 + -p 引入文件 …,可以直接生成exe文件。
2.exe文件過大
- 安裝python虛擬環境;
- 導入包時,使用form + 包名 + import + 功能函數,不要直接import + 包名。
3.出現莫名其妙的錯誤
- python文件所在的全路徑,儘量不要有中文存在。
4.打包成一個文件夾後,發送給其他人無法使用
- 需要將dist下麵的文件夾整體發送,保持exe文件與dist下麵文件夾的路徑不變。
5.運行exe文件後,沒有達到預期效果
- 文件報錯了,重新打包文件,使用控制台(去掉-w參數),將會在控制台顯示程式運行過程與列印錯誤。
6.python腳本主要是命令行輸出,但是程式執行完後就退出無法查看輸出信息
- 在python腳本最後一行添加命令:os.system(“pause”)或者raw_input(“輸出任意按鍵即可退出”)。
作者:京東物流 駱銅磊
來源:京東雲開發者社區 自猿其說Tech