# -*- mode: python ; coding: utf-8 -*- import os import dataui import confluent_kafka # 新增:用于获取动态库路径 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) # 如果目录不存在,尝试另一种常见位置(有时 .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 # 调试输出(打包时会打印在控制台,方便确认) 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 # ---- 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 ) 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 )