diff --git a/kgadget/ubuntu/kgadget.spec b/kgadget/ubuntu/kgadget.spec index 09c38b6..d100176 100644 --- a/kgadget/ubuntu/kgadget.spec +++ b/kgadget/ubuntu/kgadget.spec @@ -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 +) \ No newline at end of file diff --git a/kgadget/ubuntu/kgadget_bak.spec b/kgadget/ubuntu/kgadget_bak.spec new file mode 100644 index 0000000..09c38b6 --- /dev/null +++ b/kgadget/ubuntu/kgadget_bak.spec @@ -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 )