This commit is contained in:
ping 2026-07-02 16:43:54 +08:00
parent 242f578fad
commit 5e34a9993d

View File

@ -3,18 +3,15 @@
import os import os
import dataui import dataui
import confluent_kafka import confluent_kafka
from PyInstaller.utils.hooks import collect_dynamic_libs from PyInstaller.utils.hooks import collect_dynamic_libs, collect_submodules
# ---- 定位 confluent_kafka.libs 目录 ---- # ---- 定位 confluent_kafka.libs ----
# 根据你的实际路径,该方法会得到 /d/zhc/.local/lib/python3.10/site-packages/confluent_kafka.libs
kafka_libs_dir = os.path.join( kafka_libs_dir = os.path.join(
os.path.dirname(confluent_kafka.__file__), os.path.dirname(confluent_kafka.__file__),
'..', '..',
'confluent_kafka.libs' 'confluent_kafka.libs'
) )
kafka_libs_dir = os.path.normpath(kafka_libs_dir) kafka_libs_dir = os.path.normpath(kafka_libs_dir)
# 如果上述路径不存在,尝试另一种可能的布局(备选)
if not os.path.exists(kafka_libs_dir): if not os.path.exists(kafka_libs_dir):
alt_dir = os.path.join( alt_dir = os.path.join(
os.path.dirname(os.path.dirname(confluent_kafka.__file__)), os.path.dirname(os.path.dirname(confluent_kafka.__file__)),
@ -23,38 +20,31 @@ if not os.path.exists(kafka_libs_dir):
if os.path.exists(alt_dir): if os.path.exists(alt_dir):
kafka_libs_dir = alt_dir kafka_libs_dir = alt_dir
# 打包时打印路径以便确认
print(f"[SPEC] Kafka libs dir: {kafka_libs_dir}, exists: {os.path.exists(kafka_libs_dir)}") print(f"[SPEC] Kafka libs dir: {kafka_libs_dir}, exists: {os.path.exists(kafka_libs_dir)}")
# 如果仍然不存在,可以硬编码为你的实际路径(但建议使用动态方式) # ---- 收集 numpy/pandas 动态库(若使用) ----
# kafka_libs_dir = "/d/zhc/.local/lib/python3.10/site-packages/confluent_kafka.libs" numpy_binaries = collect_dynamic_libs('numpy') if False else [] # 如果使用,改为 True
# ---- 收集其他动态库(如 numpy, pandas ----
# 如果你确实使用了它们,可以取消注释并同样处理
numpy_binaries = collect_dynamic_libs('numpy') if False else []
pandas_binaries = collect_dynamic_libs('pandas') if False else [] pandas_binaries = collect_dynamic_libs('pandas') if False else []
# 如果有其他二进制文件,可以合并到 all_binaries # 我们也可以直接通过 datas 包含它们的 .libs 目录(但更推荐用 collect_dynamic_libs
all_binaries = [] # 这里暂时为空,因为我们用 datas 处理了 kafka # 这里我们先用 collect_dynamic_libs 并合并到 binaries
all_binaries = numpy_binaries + pandas_binaries # 加入 kafka 吗?不,我们用 datas
duipath = os.path.dirname(dataui.__file__) duipath = os.path.dirname(dataui.__file__)
block_cipher = None block_cipher = None
# ---- Analysis ----
a = Analysis( a = Analysis(
['../src/kgadget.py'], ['../src/kgadget.py'],
pathex=['../src'], pathex=['../src'],
binaries=all_binaries, # 保留,以防将来需要 binaries=all_binaries, # 包含 numpy/pandas 的 .so
datas=[ datas=[
(f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks'), (f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks'),
# 关键:将整个 confluent_kafka.libs 目录复制到打包目录的 confluent_kafka.libs 下 (kafka_libs_dir, 'confluent_kafka.libs'), # 复制整个 kafka 目录
(kafka_libs_dir, 'confluent_kafka.libs'),
], ],
hiddenimports=[ hiddenimports=[
'sqlite3', 'sqlite3',
'aiopg', 'aiopg',
'aiomysql', 'aiomysql',
'confluent_kafka.admin', # 确保子模块被包含 'confluent_kafka.admin',
# 如果你使用了其他子模块(如 avro, schema_registry也在这里添加
], ],
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
@ -68,7 +58,6 @@ a = Analysis(
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
# ---- EXE ----
exe = EXE( exe = EXE(
pyz, pyz,
a.scripts, a.scripts,
@ -80,13 +69,13 @@ exe = EXE(
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=False,
upx=False, # 关闭 UPX,防止压缩动态库 upx=False, # 务必关闭 UPX
upx_exclude=[], upx_exclude=[],
runtime_tmpdir=None, # 你可以指定一个可写目录,如 '/tmp/kgadget' runtime_tmpdir=None,
console=True, console=True,
disable_windowed_traceback=False, disable_windowed_traceback=False,
target_arch=None, target_arch=None,
codesign_identity=None, codesign_identity=None,
entitlements_file=None, entitlements_file=None,
onefile=False # 使用 onedir 模式(生成文件夹) onefile=False # 显式指定 onefile=False
) )