脚本关注点和所用打包方法
打包命令,当前要打包的脚本是项目根目录下的decimate_json.py文件
pyinstaller decimate_json.py
decimate_json.py中引用其它脚本,要这样写
# 导入项目根目录下的xxx.py
import xxx
# 从项目根目录下decimate_tool目录下的aaa.py
from decimate_tool import aaa
打包结果
打包完成后生成一个exe和一个文件夹_internal
运行报错
此exe是一个命令行程序,运行时报错:
Traceback (most recent call last):
File "decimate_json.py", line 47, in <module>
File "decimate_json.py", line 20, in perform
File "pyimod02_importers.py", line 457, in exec_module
File "decimate_tool\decimate_ply.py", line 8, in <module>
File "pyimod02_importers.py", line 457, in exec_module
File "torch_scatter\__init__.py", line 18, in <module>
ImportError: Could not find module '_version_cpu' in E:\Project\aaa\dist\decimate_json\_internal\torch_scatter
[PYI-12992:ERROR] Failed to execute script 'decimate_json' due to unhandled exception!
重点是ImportError:Could not find module找不到模块,
解决办法一:
从虚拟环境的Lib/site-packages下复制 torch_scatter到_internal目录,再次运行命令行就成功了。
解决办法二:
使用--onefile --add-data "zzz;zz"来将没有打包进去的包打进去
pyinstaller --onefile decimate_json.py --add-data "E:\Program Files\Python310\envs\env\Lib\site-packages\torch_scatter;torch_scatter"
如果缺少多个包,怎么办呢?终极解决方案来了:
第一步:生成spec文件
pyi-makespec --onefile decimate_json.py
在终端执行这个命令后,会生成文件decimate_json.spec,这是pyinstaller打包配置文件,我们来编译它,它的默认值是这样的:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['decimate_json.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='decimate_json',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
第二步:编辑datas=[]
在datas=[]添加缺少的包,至于缺少什么包,通过打包出来的exe运行时看报错信息来定位哪些包
datas=[
('E:\\Program Files\\Python310\\envs\\evn\\Lib\\site-packages\\torch_scatter','torch_scatter'),
('E:\\Program Files\\Python310\\envs\\evn\\Lib\\site-packages\\xxx','xxx')
],
第三步:打包的命令有变化:
pyinstaller decimate_json.spec
26万+

被折叠的 条评论
为什么被折叠?



