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