折腾过程
经过一个多星期的反复折腾,尝试过使用pyinstaller、cx_freeze等不同的打包方式,也尝试过安装旧版的Mayavi、traits等,打包后的exe文件仍然不停的报错,始终运行不起来
错误1:
RuntimeError: No pyface.toolkits plugin found for toolkit null
错误2:
解决方案:
最终还是使用pyinstaller打包成功,包的版本也都是当前的最新版本,不需要回退到旧版本。
1.我的环境
win10 64位
python 3.8.0
mayavi-4.7.4
numpy-1.22.2
pyface-7.4.0
traits-6.3.2
vtk-9.1.0
pyinstaller-4.9
2.关键步骤
尝试打包之后,都会存在一个xxx.spec的文件,将自己的脚本文件与该spec文件都移动到python的安装目录下的Lib\site-packages,如图,我的python是安装在C盘的,红框框起来的分别为我的脚本文件和spec文件。
spec文件具体内容如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['ball4.py'],
pathex=[],
binaries=[
('traitsui', 'traitsui'),('traitsui-7.2.1.dist-info','traitsui-7.2.1.dist-info'),
('pyface', 'pyface'),('pyface-7.4.0.dist-info','pyface-7.4.0.dist-info'),
('wx', 'wx'),('wxPython-4.1.1.dist-info','wxPython-4.1.1.dist-info'),
('traits', 'traits'),('traits-6.3.2.dist-info','traits-6.3.2.dist-info'),
('numpy', 'numpy'),('numpy-1.22.2.dist-info','numpy-1.22.2.dist-info'),
('mayavi', 'mayavi'),('mayavi-4.7.4.dist-info','mayavi-4.7.4.dist-info'),
('apptools', 'apptools'),('apptools-5.1.0.dist-info','apptools-5.1.0.dist-info'),
('vtk-9.1.0.dist-info','vtk-9.1.0.dist-info'),
('tvtk','tvtk'),
('vtkmodules','vtkmodules'),
],
datas=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='ball4',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
关键部分就是在binaries[]中将主要的几个包手动引入进来,注:我是将所有的包都直接安装在了python主体目录下,没有安装在virtualenv虚拟环境中,所以这几个主要的包都在当前和脚本同一目录下,可以直接引入。
如果是需要在虚拟环境中打包的话,可以尝试在pathex中把自己电脑上python目录下的Lib\site-packages加进入,例pathex=[‘C:\Python\Python38\Lib\site-packages’],binaries[]中引入的包改成对应的目录,但是本人未验证过该方式,不确定是否可行。
最后在当前目录使用打包命令,直接使用spec文件进行打包
pyinstaller -F -w xxx.spec
打包成功后,在当前目录dist文件中,点击exe文件可以正常运行。