基於Kivy的Python界面程序打包爲EXE的問題

最近用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,修改安裝,檢查以下三項是否勾選:

  1. 通用Windows平臺開發
  2. Windows C++開發
  3. 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, GLEW
pyi-makespec -F main.py 成功執行後會生成main.spec文件,這步作用實際是分析依賴的庫,爲下一步生成獨立EXE做準備。main.spec實際也是一個python文件,需要在python文件裏面增加如下兩行代碼:

  1. 以下是增加的一行代碼:
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相同目錄下,否則運行出來的界面只是一個空界面,沒有任何控件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章