diff --git a/kgadget/ubuntu/build.sh b/kgadget/ubuntu/build.sh index 156f064..6f1848b 100644 --- a/kgadget/ubuntu/build.sh +++ b/kgadget/ubuntu/build.sh @@ -1 +1 @@ -pyinstaller -y --clean kgadget.spec +pyinstaller -y --clean kgadget.spec 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 ) diff --git a/kgadget/ubuntu/kgadget_bak1.spec b/kgadget/ubuntu/kgadget_bak1.spec new file mode 100644 index 0000000..8205436 --- /dev/null +++ b/kgadget/ubuntu/kgadget_bak1.spec @@ -0,0 +1,81 @@ +# -*- mode: python ; coding: utf-8 -*- + +import os +import dataui +import confluent_kafka +from PyInstaller.utils.hooks import collect_dynamic_libs, collect_submodules + +# ---- 定位 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) +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] Kafka libs dir: {kafka_libs_dir}, exists: {os.path.exists(kafka_libs_dir)}") + +# ---- 收集 numpy/pandas 动态库(若使用) ---- +numpy_binaries = collect_dynamic_libs('numpy') if False else [] # 如果使用,改为 True +pandas_binaries = collect_dynamic_libs('pandas') if False else [] +# 我们也可以直接通过 datas 包含它们的 .libs 目录(但更推荐用 collect_dynamic_libs) +# 这里我们先用 collect_dynamic_libs 并合并到 binaries +all_binaries = numpy_binaries + pandas_binaries # 加入 kafka 吗?不,我们用 datas + +duipath = os.path.dirname(dataui.__file__) +block_cipher = None + +a = Analysis( + ['../src/kgadget.py'], + pathex=['../src'], + binaries=all_binaries, # 包含 numpy/pandas 的 .so + datas=[ + (f'{duipath}/tmpl/bricks/*.*', 'dataui/tmpl/bricks'), + (kafka_libs_dir, 'confluent_kafka.libs'), # 复制整个 kafka 目录 + ], + 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( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='kgadget', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=False, # 务必关闭 UPX + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + onefile=False # 显式指定 onefile=False +) \ No newline at end of file