基于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相同目录下,否则运行出来的界面只是一个空界面,没有任何控件。

你可能感兴趣的:(基于Kivy的Python界面程序打包为EXE的问题)