From f65f0b31acaa0e08229b1bfbf727926fe6776ad7 Mon Sep 17 00:00:00 2001 From: fanpt <320622572@qq.com> Date: Wed, 27 Aug 2025 13:59:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8C=85=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.spec | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 package.spec diff --git a/package.spec b/package.spec new file mode 100644 index 0000000..4eafd02 --- /dev/null +++ b/package.spec @@ -0,0 +1,98 @@ +# -*- mode: python ; coding: utf-8 -*- +# LiveTalking.spec + +import os +from PyInstaller.building.build_main import Analysis, PYZ, EXE, COLLECT + +block_cipher = None +# 项目根目录:确保在此目录运行 pyinstaller +PROJECT_ROOT = os.path.abspath('.') + +# Helper 函数:递归收集文件 + +def collect_dir(src_folder, dest_folder): + """ + 将 src_folder 下所有文件打包到 dist/.../dest_folder/... 中 + 返回 datas 条目列表 [(源文件绝对路径, 目标相对目录), ...] + """ + datas = [] + for root, dirs, files in os.walk(src_folder): + for f in files: + src_file = os.path.join(root, f) + # 相对于 src_folder 的子路径 + rel_dir = os.path.relpath(root, src_folder) + if rel_dir == '.': + target_dir = dest_folder + else: + target_dir = os.path.join(dest_folder, rel_dir) + datas.append((src_file, target_dir)) + return datas + +# 1. 构建 datas 列表,收集资源目录 +datas = [] +for folder in ('models', 'data', 'web', 'ffmpeg-static'): + src_path = os.path.join(PROJECT_ROOT, folder) + if os.path.isdir(src_path): + print(f"[DEBUG] 包含目录: {src_path}") + collected = collect_dir(src_path, folder) + print(f"[DEBUG] 采集到 {len(collected)} 个文件 从 {folder}") + datas += collected +# 2. 添加配置文件支持 +config_path = os.path.join(PROJECT_ROOT, 'config', 'config.json') +if os.path.isfile(config_path): + print(f"[DEBUG] 包含配置文件: {config_path}") + datas.append((config_path, '.')) + +# 打印最终 datas 长度 +print(f"[DEBUG] datas 总计 {len(datas)} 条目") + +# hidden_imports:根据需要添加动态导入模块 +hidden_imports = [] +# print debug hidden_imports +print(f"[DEBUG] hidden_imports: {hidden_imports}") + +# 分析入口脚本和依赖 +analysis = Analysis( + ['app.py'], + pathex=[PROJECT_ROOT], + binaries=[], + datas=datas, + hiddenimports=hidden_imports, + hookspath=[], + runtime_hooks=[], + excludes=[], + cipher=block_cipher, + win_no_prefer_redirects=False, + win_private_assemblies=False, +) + +# 打包纯 Python 模块 +pyz = PYZ( + analysis.pure, + analysis.zipped_data, + cipher=block_cipher, +) + +# 创建可执行文件 +exe = EXE( + pyz, + analysis.scripts, + exclude_binaries=True, + name='livetalking', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, +) + +# 收集最终输出 +coll = COLLECT( + exe, + analysis.binaries, + analysis.zipfiles, + analysis.datas, + strip=False, + upx=True, + name='livetalking', +)