最近用Python3.6開發的一個工具程序,基於Kivy1.10.0做的界面開發。不過在打包成EXE的過程中有很多問題,通過多次Google才搞定。
EXE打包過程:(Windows10 環境)
pip install pyinstaller
(如果pip未安裝,需自行安裝)pip install pycrypto
(加密需要)pyi-makespec -F main.py
(生成SPEC文件,main.py爲主程序入口文件)pyinstaller main.spec
(打包生成EXE, 會生成build,dist兩個目錄, main.exe將在dist目錄下,如果需要加密,增加 --key=xxxxxxxxx
參數)
問題一 pycrypto報錯:找不到"stdint.h"
需要安裝Visual Studio,我的環境中本來就有Visual Studio 2017,只需進入設置-》應用和功能,找到Microsoft Visual Studio Installer,修改安裝,檢查以下三項是否勾選:
- 通用Windows平臺開發
- Windows C++開發
- Python開發
安裝過程比較漫長,安裝完成進入開始菜單,找到Visual Studio 2017 ,點擊進入VS 2017 兼容工具命令行(英文:Visual Studio 2017 Cross Tool Command Line)
打開命令行以後,輸入以下命令並執行:s
set CL=/FI”%VCINSTALLDIR%\INCLUDE\stdint.h” %CL%
如果仍然報找不到stdint.h的錯誤,那麼可以搜索Visual Studio的安裝根路徑比如C:\,看看實際stdint.h在哪個目錄下,找到以後直接拷貝到%VCINSTALLDIR%\INCLUDE也可以。
設置完成以後,重新執行pip install pycrypto
後面可能仍然會出現找不到vcruntime.h,同樣處理即可。
問題二 EXE執行報錯: SDL2: Unable to load image
這是Kivy的問題,也是打包分成2步的原因,在打包的過程漏掉了2個模塊:SDL2, GLEWpyi-makespec -F main.py
成功執行後會生成main.spec文件,這步作用實際是分析依賴的庫,爲下一步生成獨立EXE做準備。main.spec實際也是一個python文件,需要在python文件裏面增加如下兩行代碼:
- 以下是增加的一行代碼:
from kivy.deps import sdl2, glew
以下是增加sdl2和glew兩個庫的實際路徑的修改代碼:
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
name='main',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
2 以下是實際增加的一行代碼:
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
問題三 EXE執行報錯: pandas._libs.tslibs.np_datetime找不到模塊
我的程序使用了Pandas,Pandas隱含加載了其他的庫比如:
pandas._libs.tslibs.np_datetime,
pandas._libs.tslibs.timedeltas,
pandas._libs.tslibs.nattype,
pandas._libs.skiplist,
win32timezone
在main.spec生成過程中,依賴分析沒有找到,因此需要我們在spec文件手工導入,在spec中修改一行代碼:
a = Analysis(['main.py'],
pathex=['d:\\HPCasToolInstaller'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
實際修改的一行代碼:
hiddenimports=['pandas._libs.tslibs.timedeltas', 'pandas._libs.tslibs.nattype', 'pandas._libs.skiplist', 'pandas._libs.tslibs.np_datetime', 'win32timezone'],
經過以上處理,打包完成後的EXE應該可以實際運行了,如果Kivy界面通過kv文件創建,還需要把kv文件放到EXE相同目錄下,否則運行出來的界面只是一個空界面,沒有任何控件。