如何为多入口点Python应用制作PyInstaller单可执行包?
多入口点Python程序打包为单个PyInstaller可执行文件方案
核心思路:单EXE通过命令行参数分发入口
只打包一个主入口EXE,用命令行参数指定要运行的具体实验入口(如main_1、main_2),这样仅需一次PyInstaller打包,生成单个包含所有依赖的EXE,同时支持全部入口点。
具体实现步骤
1. 编写统一主入口脚本
创建main_entry.py作为PyInstaller的打包入口,代码如下:
import sys from my_program.main import main_1, main_2, main_N # 导入所有实验入口函数 def main(): if len(sys.argv) < 2: print("请指定要运行的实验:run-experiment-1/run-experiment-2/.../run-experiment-N") sys.exit(1) command = sys.argv[1] # 建立命令与入口函数的映射 command_map = { "run-experiment-1": main_1, "run-experiment-2": main_2, # 依次添加所有N个实验的映射关系 "run-experiment-N": main_N } if command not in command_map: print(f"无效命令:{command}") sys.exit(1) # 执行对应入口函数 command_map[command]() if __name__ == "__main__": main()
2. 用PyInstaller打包主脚本
执行以下命令生成单个独立EXE:
pyinstaller --onefile main_entry.py
此命令仅生成一个main_entry.exe,包含所有项目依赖,无需为每个入口重复打包。
3. 通过NSIS创建对应快捷方式
在NSIS脚本中,为每个实验入口创建快捷方式,目标指向打包好的main_entry.exe并附加对应命令行参数:
run-experiment-1快捷方式目标:"$INSTDIR\main_entry.exe" run-experiment-1run-experiment-2快捷方式目标:"$INSTDIR\main_entry.exe" run-experiment-2- 以此类推,将所有快捷方式放置到开始菜单指定位置。
额外优化建议
- 若实验数量较多,可通过动态导入简化映射逻辑,无需手动逐个添加入口:
import sys import my_program.main as main_module def main(): if len(sys.argv) < 2: print("请指定要运行的实验:run-experiment-1/run-experiment-2/.../run-experiment-N") sys.exit(1) command = sys.argv[1] # 从命令中提取实验编号,动态匹配入口函数 try: exp_num = command.split("-")[-1] func_name = f"main_{exp_num}" entry_func = getattr(main_module, func_name) except (IndexError, AttributeError): print(f"无效命令:{command}") sys.exit(1) entry_func() if __name__ == "__main__": main()
新增实验时,只需在my_program.main中添加main_X格式的函数即可,无需修改主入口脚本。
- 打包时可通过
--name参数自定义EXE名称,比如:
pyinstaller --onefile --name my_experiments main_entry.py
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

