如何通过Pyoxidizer将Torch模型文件打包进exe并在脚本中调用
使用Pyoxidizer打包Torch模型到EXE的完整方案
一、修改Pyoxidizer配置文件(pyoxidizer.bzl)
Pyoxidizer的add_python_resources仅适配Python模块/包资源,二进制模型文件需要用add_files指令添加。在make_exe函数中补充以下配置:
def make_exe(): dist = default_python_distribution() policy = dist.make_python_packaging_policy() exe = dist.make_python_executable(policy) # 绑定你的主脚本 exe.add_python_module(name="your_main_script") # 核心配置:添加Torch模型到打包资源 # 替换为你的本地模型路径,dest_path是运行时虚拟文件系统中的路径 exe.add_files( files=["path/to/your/model.pth"], # 本地模型的相对/绝对路径 dest_path="model.pth", # 打包后模型的虚拟路径 is_executable=False ) # 若模型是文件夹形式(如torch.save保存的目录结构),改用以下写法 # exe.add_files( # files=["path/to/your_model_dir"], # dest_path="your_model_dir", # is_executable=False # ) return exe
二、修改Python代码,动态读取打包后的模型
Pyoxidizer打包后模型存储在虚拟文件系统中,不能直接用本地路径加载,需通过importlib.resources动态获取路径:
import torch import importlib.resources def load_model(): # 对应pyoxidizer.bzl中设置的dest_path with importlib.resources.path("", "model.pth") as model_path: # 文件夹模型直接传入目录路径即可 # with importlib.resources.path("", "your_model_dir") as model_path: model = torch.load(model_path, map_location="cpu") # 根据需求指定设备 return model # 主逻辑 if __name__ == "__main__": model = load_model() # 后续业务代码
三、验证与打包
- 本地测试:执行
pyoxidizer run,确认模型能正常加载 - 生成EXE:执行
pyoxidizer build,产物位于build/<target>/release目录下
常见问题排查
- 路径错误:确保pyoxidizer.bzl中
files的路径是相对配置文件的路径,或直接使用绝对路径 - 模型格式问题:文件夹模型需完整添加整个目录,代码中加载路径指向目录而非单个文件
- 权限问题:设置
is_executable=False确保模型以非可执行权限打包
内容的提问来源于stack exchange,提问作者JonnyET
相关产品推荐
相关产品推荐

