使用Nuitka将多Python/JSON文件打包为单可执行文件的问题
解决方案
问题根源
你的核心问题在于原代码用subprocess直接调用.py文件,Nuitka编译后无法通过这种方式运行未打包的Python脚本,强行包含.py文件又会导致冗余。要实现单EXE+高混淆性,需要调整代码结构并配合正确的Nuitka编译参数。
步骤1:重构代码,替换subprocess为多进程调用
将main.py和port.py的入口逻辑封装为可调用函数,在launcher.py中用Python多进程模块启动,避免依赖外部脚本文件。
- 修改
main.py:
# main.py def main(): # 放入原main.py中if __name__ == "__main__":下的所有逻辑 print("Running main process") if __name__ == "__main__": main()
- 修改
port.py:
# port.py def main(): # 放入原port.py中if __name__ == "__main__":下的所有逻辑 print("Running port process") if __name__ == "__main__": main()
- 修改
launcher.py:
# launcher.py import multiprocessing import time import main import port if __name__ == "__main__": # 启动port进程 proc1 = multiprocessing.Process(target=port.main) proc1.start() time.sleep(1) # 启动main进程 proc2 = multiprocessing.Process(target=main.main) proc2.start() # 等待main进程结束 proc2.join() # 终止port进程并回收资源 proc1.terminate() proc1.join()
步骤2:用Nuitka编译为单EXE
使用以下命令编译,生成单个可执行文件,同时包含config.json数据文件:
nuitka --onefile --include-data-file=config.json=config.json --follow-imports launcher.py
参数说明
--onefile:生成单个独立EXE文件,所有依赖(DLL、编译后的模块)都会被打包进该文件,运行时自动解压到临时目录--include-data-file=config.json=config.json:将config.json作为数据文件打包进EXE,运行时会被提取到对应目录--follow-imports:自动跟随导入的main和port模块,将它们编译进EXE,无需手动指定
效果说明
- 最终仅生成一个
launcher.exe文件,无冗余.py文件 - 所有Python代码都会被Nuitka转换为C代码后编译,具备良好的混淆性,难以逆向解析
- 运行时自动处理依赖,无需额外携带第三方DLL
内容的提问来源于stack exchange,提问作者Pratyush Rai
相关产品推荐
相关产品推荐

