pyinstaller ---轉載文章
-
PyInstaller可以用來打包python應用程序,打包完的程序就可以在沒有安裝Python解釋器的機器上運行了。PyInstaller支持Python 2.7和Python 3.3+。可以在Windows、Mac OS X和Linux上使用,但是並不是跨平台的,而是說你要是希望打包成.exe文件,需要在Windows系統上運行PyInstaller進行打包工作;打包成mac app,需要在Mac OS上使用。
-
安裝
- pip isntall pyinstaller
-
使用
- 命令行程序
- pyinstaller helloworld.py
- 窗口程序+命令行輸出
- pyinstaller happy_not.py
- 只有窗口程序
- pyinstaller -w happy_not.py
- 命令行程序
-
重要選項
- -D, --one-dir打包成一個文件夾,默認
- -F, --one-file打包成一個exe文件 (啟動慢,在C盤中創建_MEIxxxxxx臨時文件夾,由bootloader復制文件運行結束后自動刪除,意外關閉程序,臨時文件無法刪除)
- -p DIR, --paths DIR添加路徑,一般用來添加程序所用到的包的所在位置
- -c, --console,
- --nowindowed無視窗,程序后台運行
- -w, --windowed, --noconsole 提供程序視窗,程序沒有命令行輸出,默認
- -i 添加icon圖標 pyinstaller -F -w -i "D:\360Downloads\2018-10\pyqt5\pyqt5-processBar\pic.icon" "D:\360Downloads\2018-10\pyqt5\pyqt5-processBar\Main.py
- -d, --debug 生成debug模式的exe文件
- -v FILE, --version=FILE 加入版本信息文件
- -o DIR, --out=DIR 設置spec文件輸出的目錄,默認在PyInstaller同目錄
-
經驗
- py程序中使用了第三方庫的打包方式(如果python 直接使用cmd安裝第三方庫在默認環境下而不是anaconda 可以不用復制第三方庫)
- 在打包之前務必找到第三方庫的包,把包復制到到跟myfile.py同目錄下,然后再使用以上2種方式打包,否則會打包失敗或者即使打包成功,程序也會閃退
- 例如使用BeautifulSoup解析xml
- from bs4 import BeautifulSoup
- so = BeautifulSoup(msg, 'xml')
- 使用了lxml模塊,必須把C:\Users\play\AppData\Local\Programs\Python\Python36\Lib\site-packages\lxml文件夾復制到打包文件夾
- 另外一個方法是
- import lxml
- pyinstaller會自動引入
- py程序中使用了第三方庫的打包方式(如果python 直接使用cmd安裝第三方庫在默認環境下而不是anaconda 可以不用復制第三方庫)
pyinstaller打包程序常見問題總結:
1、缺少PyQt5.sip
重新cmd安裝 pip install PyQt5.sip
2、
Could not find the Qt platform plugin "windows" in This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
解決方法:拷貝pyqt5的platforms文件夾到生成的可執行程序同級目錄下,如我的是:C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\plugins
3、打開exe文件運行無反應
- 首先查看自己打包時候用的參數,如果碼中沒有tkinter之類的GUI窗口的話就不要用 -w 了
同時查看一下碼里面有沒有標准化輸入輸出,例如print,如果有就不要用 -w
因為 -w 參數的意思是關掉控制台dos窗口,本來要顯示的東西就只能顯示在dos上,所以自然什都沒有
解決方法:
pyinstaller -F xxx.py
4、問題:提示failed to execute script xxx
這個問題我遇到的時候是用tkinter在寫一個小程序,生成exe點開之后就出現了failed to execute script xxx的問題,如下圖
重新打包,在打包的時候加入了參數 -c
加入參數-c后重新打包再次運行exe
-c的作用是返回錯誤信息!錯誤信息如上圖所示,沒有找到‘bg.jpg’!
這個文件是我用作tkinter窗口背景的一張資源。
這張圖片是直接放在py文件的同一目錄下的,直接打開py文件運行沒有問題
而生成exe后運行卻提示failed to execute scrip...
問題就出在這里!打包后的exe生成在dist文件夾中,exe不在與資源文件在同一目錄,將‘bg.jpg’ copy到 與exe文件同一目錄下以后問題解決。由此知道,pyinstaller打包並沒有將調用到的資源文件打包在exe文件中,所以exe沒有辦法再用到該資源。解決辦法是將資源和exe文件放到同一目錄或者將源碼中用到的資源路徑改成絕對路徑。
5、問題:打包的時候出現了很多warning:lib not found...dll
- 原因是pyinstaller 沒有辦法識別到這些dll
解決辦法:是中copy warning中一些dll文件的名字,再電腦中搜索到他們的路徑!
我搜索到的路徑:C:UsersASUSAppDataRoamingpyinstallerbincache00_py36_64bit
該路徑下面就是那一大堆warning的dll文件,這個路徑添加到環境變量里面
方法如下
右鍵 此電腦——屬性——高級——環境變量——用戶變量中Path編輯新建然后填入剛剛dll所在的路徑
然后問題就解決了
6、已經安裝了PyQt5.sip 但是打開打包后的exe文件總是報錯缺少PyQt5.sip
解決辦法:
在程序中 引用:import PyQt5.sip