This commit is contained in:
ping 2026-07-02 16:12:04 +08:00
parent 3e07f7aea7
commit 43dfaf1a85
2 changed files with 135 additions and 48 deletions

View File

@ -2,59 +2,86 @@
import os
import dataui
import confluent_kafka # 新增:用于获取动态库路径
from PyInstaller.utils.hooks import collect_dynamic_libs
from PyInstaller.utils.hooks import collect_dynamic_libs # 新增导入
# ---- 定位 confluent_kafka.libs 目录(关键) ----
kafka_libs_dir = os.path.join(
os.path.dirname(confluent_kafka.__file__),
'..',
'confluent_kafka.libs'
)
kafka_libs_dir = os.path.normpath(kafka_libs_dir)
# 收集所有科学计算库的动态库
numpy_binaries = collect_dynamic_libs('numpy')
# scipy_binaries = collect_dynamic_libs('scipy') # 如果使用了 scipy
pandas_binaries = collect_dynamic_libs('pandas') # 如果使用了 pandas
kafka_binaries = collect_dynamic_libs('confluent_kafka')
# 如果目录不存在,尝试另一种常见位置(有时 .libs 直接位于 site-packages 下)
if not os.path.exists(kafka_libs_dir):
alt_dir = os.path.join(
os.path.dirname(os.path.dirname(confluent_kafka.__file__)),
'confluent_kafka.libs'
)
if os.path.exists(alt_dir):
kafka_libs_dir = alt_dir
# 合并所有动态库列表
all_binaries = kafka_binaries
# 调试输出(打包时会打印在控制台,方便确认)
print(f"[SPEC] Using kafka libs dir: {kafka_libs_dir}, exists: {os.path.exists(kafka_libs_dir)}")
# ---- 收集其他动态库numpy/pandas如果你使用的话 ----
numpy_binaries = collect_dynamic_libs('numpy') if False else [] # 暂不启用,若有问题可单独处理
# scipy_binaries = collect_dynamic_libs('scipy')
pandas_binaries = collect_dynamic_libs('pandas') if False else []
# 这里我们只关心 kafka但为了兼容保留一个空列表
all_binaries = [] # 如果你还有其他二进制文件,可以合并进来
duipath = os.path.dirname(dataui.__file__)
block_cipher = None
a = Analysis(['../src/kgadget.py'],
pathex=['../src'],
binaries=all_binaries,
datas=[
(f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks')
],
hiddenimports=[
'sqlite3',
'aiopg',
'aiomysql'
],
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)
# ---- Analysis 部分 ----
a = Analysis(
['../src/kgadget.py'],
pathex=['../src'],
binaries=all_binaries, # 暂时为空,后续如有其他 .so 可加入
datas=[
(f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks'),
# 新增:将整个 confluent_kafka.libs 目录复制到打包目录的 confluent_kafka.libs 下
(kafka_libs_dir, 'confluent_kafka.libs'),
],
hiddenimports=[
'sqlite3',
'aiopg',
'aiomysql',
'confluent_kafka.admin', # 确保子模块被包含
# 如果你还用到其他子模块,可以继续添加
],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False
)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='kgadget',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
# ---- EXE 部分 ----
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='kgadget',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None, # 如果仍出现解压错误,可在这里指定一个可写目录
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None
)

View File

@ -0,0 +1,60 @@
# -*- mode: python ; coding: utf-8 -*-
import os
import dataui
from PyInstaller.utils.hooks import collect_dynamic_libs # 新增导入
# 收集所有科学计算库的动态库
numpy_binaries = collect_dynamic_libs('numpy')
# scipy_binaries = collect_dynamic_libs('scipy') # 如果使用了 scipy
pandas_binaries = collect_dynamic_libs('pandas') # 如果使用了 pandas
kafka_binaries = collect_dynamic_libs('confluent_kafka')
# 合并所有动态库列表
all_binaries = kafka_binaries
duipath = os.path.dirname(dataui.__file__)
block_cipher = None
a = Analysis(['../src/kgadget.py'],
pathex=['../src'],
binaries=all_binaries,
datas=[
(f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks')
],
hiddenimports=[
'sqlite3',
'aiopg',
'aiomysql'
],
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='kgadget',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )