Pyinstaller打包exe

脚本关注点和所用打包方法

打包命令,当前要打包的脚本是项目根目录下的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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值