From 24e525ab70d8f40798fd3348686bd87d4d2f996c Mon Sep 17 00:00:00 2001 From: dongchangxi <458593490@qq.com> Date: Tue, 16 Dec 2025 19:03:37 +0800 Subject: [PATCH] exe7 --- factory_sliceing/build_exe.py | 12 ++++ .../hook-auto_sliceing_operate.py | 11 +++- factory_sliceing/hook-download_batch_data.py | 10 +++- factory_sliceing/main.py | 56 ++++++++++++------- 4 files changed, 63 insertions(+), 26 deletions(-) diff --git a/factory_sliceing/build_exe.py b/factory_sliceing/build_exe.py index 0a6da09..897fd08 100644 --- a/factory_sliceing/build_exe.py +++ b/factory_sliceing/build_exe.py @@ -40,6 +40,9 @@ def build_exe(): '--hidden-import=download_batch_data.main_download_batch_data_and_trans', # 收集所有子模块,确保 PyInstaller 能找到所有模块 + # 使用 collect-submodules 明确收集所有子模块 + '--collect-submodules=auto_sliceing_operate', # 收集所有子模块 + '--collect-submodules=download_batch_data', # 收集所有子模块 '--collect-all=auto_sliceing_operate', # 使用 collect-all 确保包含所有子模块和依赖 '--collect-all=download_batch_data', # 使用 collect-all 确保包含所有子模块和依赖 '--hidden-import=auto_sliceing_operate.utils', @@ -138,10 +141,19 @@ def build_exe(): # 也添加到 download_batch_data/utils/ 目录(备用路径) cmd.append(f'--add-data={small_transform_file}{path_sep}download_batch_data/utils') + # 添加 Python 路径,确保 PyInstaller 能找到所有模块 + # 将当前目录添加到 Python 路径中 + cmd.append(f'--paths={current_dir}') + # 添加 hook 文件路径(如果存在) hook_path = current_dir + # 确保 hook 文件存在并添加到 PyInstaller 的 hook 搜索路径 if os.path.exists(os.path.join(current_dir, 'hook-auto_sliceing_operate.py')): cmd.append(f'--additional-hooks-dir={hook_path}') + if os.path.exists(os.path.join(current_dir, 'hook-download_batch_data.py')): + # 如果还没有添加 hook 路径,再次添加(不会重复) + if f'--additional-hooks-dir={hook_path}' not in cmd: + cmd.append(f'--additional-hooks-dir={hook_path}') # 添加工作目录设置和主脚本 cmd.extend([ diff --git a/factory_sliceing/hook-auto_sliceing_operate.py b/factory_sliceing/hook-auto_sliceing_operate.py index b55257b..3310505 100644 --- a/factory_sliceing/hook-auto_sliceing_operate.py +++ b/factory_sliceing/hook-auto_sliceing_operate.py @@ -1,11 +1,12 @@ # PyInstaller hook for auto_sliceing_operate package from PyInstaller.utils.hooks import collect_submodules, collect_data_files -# 收集所有子模块 +# 收集所有子模块(包括递归子模块) hiddenimports = collect_submodules('auto_sliceing_operate') -# 确保包含所有必要的模块 -hiddenimports += [ +# 确保包含所有必要的模块(即使 collect_submodules 已经包含,显式声明更安全) +explicit_imports = [ + 'auto_sliceing_operate', 'auto_sliceing_operate.main_begin_sliceing', 'auto_sliceing_operate.main_download_zip', 'auto_sliceing_operate.utils', @@ -16,5 +17,9 @@ hiddenimports += [ 'auto_sliceing_operate.utils.oss_redis', 'auto_sliceing_operate.utils.request', 'auto_sliceing_operate.utils.logs', + 'auto_sliceing_operate.utils.zip', ] +# 合并列表并去重 +hiddenimports = list(set(hiddenimports + explicit_imports)) + diff --git a/factory_sliceing/hook-download_batch_data.py b/factory_sliceing/hook-download_batch_data.py index 35308e3..d84c20d 100644 --- a/factory_sliceing/hook-download_batch_data.py +++ b/factory_sliceing/hook-download_batch_data.py @@ -1,11 +1,12 @@ # PyInstaller hook for download_batch_data package from PyInstaller.utils.hooks import collect_submodules, collect_data_files -# 收集所有子模块 +# 收集所有子模块(包括递归子模块) hiddenimports = collect_submodules('download_batch_data') -# 确保包含所有必要的模块 -hiddenimports += [ +# 确保包含所有必要的模块(即使 collect_submodules 已经包含,显式声明更安全) +explicit_imports = [ + 'download_batch_data', 'download_batch_data.main_download_batch_data_and_trans', 'download_batch_data.utils', 'download_batch_data.utils.funcs', @@ -16,3 +17,6 @@ hiddenimports += [ 'download_batch_data.utils.logs', ] +# 合并列表并去重 +hiddenimports = list(set(hiddenimports + explicit_imports)) + diff --git a/factory_sliceing/main.py b/factory_sliceing/main.py index 4c455cd..7af86d7 100644 --- a/factory_sliceing/main.py +++ b/factory_sliceing/main.py @@ -4,29 +4,45 @@ import importlib from utils.config import cfg, get_work_dir # 在模块级别显式导入,确保 PyInstaller 能检测到并打包这些模块 -# 使用 try-except 避免在运行时出错(虽然这些导入应该总是成功的) -try: - # 这些导入语句会被 PyInstaller 分析,确保模块被包含 - import auto_sliceing_operate.main_begin_sliceing as _unused1 - import auto_sliceing_operate.main_download_zip as _unused2 - import download_batch_data.main_download_batch_data_and_trans as _unused3 -except ImportError: - # 如果导入失败(不应该发生),继续执行 - pass +# 这些导入语句会被 PyInstaller 分析,确保模块被包含 +# 注意:不要使用 try-except,因为 PyInstaller 需要看到这些导入才能正确打包 +import auto_sliceing_operate.main_begin_sliceing +import auto_sliceing_operate.main_download_zip +import download_batch_data.main_download_batch_data_and_trans + +# 同时导入这些模块的依赖,确保所有子模块都被包含 +import auto_sliceing_operate.utils +import auto_sliceing_operate.utils.exe_operate +import auto_sliceing_operate.utils.click_soft_button +import auto_sliceing_operate.utils.import_all_file +import auto_sliceing_operate.utils.miniIo +import auto_sliceing_operate.utils.oss_redis +import auto_sliceing_operate.utils.request +import auto_sliceing_operate.utils.logs +import download_batch_data.utils def get_command_handler(command): """动态导入并返回命令处理函数""" - if command == 'batch_download': - module = importlib.import_module('download_batch_data.main_download_batch_data_and_trans') - return module.main - elif command == 'begin_sliceing': - module = importlib.import_module('auto_sliceing_operate.main_begin_sliceing') - return module.main - elif command == 'download_slice': - module = importlib.import_module('auto_sliceing_operate.main_download_zip') - return module.main - else: - return None + try: + if command == 'batch_download': + module = importlib.import_module('download_batch_data.main_download_batch_data_and_trans') + return module.main + elif command == 'begin_sliceing': + module = importlib.import_module('auto_sliceing_operate.main_begin_sliceing') + return module.main + elif command == 'download_slice': + module = importlib.import_module('auto_sliceing_operate.main_download_zip') + return module.main + else: + return None + except ModuleNotFoundError as e: + print(f'错误: 无法找到模块 - {e}') + print('这可能是 PyInstaller 打包问题,请检查打包配置。') + print(f'尝试导入的模块: {command}') + raise + except Exception as e: + print(f'错误: 导入模块时发生异常 - {e}') + raise if __name__ == '__main__': # 可用命令列表