PyInstaller打包含PyTorch代码生成exe时报OSError问题求助
错误原因
该报错是TorchScript JIT编译的固有要求:带@torch.jit.script或@torch.jit.trace装饰的函数执行时需要读取对应的原始.py源码文件,而PyInstaller默认打包流程只会将.py编译为.pyc字节码归档,不会携带原始源码,且你当前的配置只收集了torch核心库的单文件源码,遗漏了swish_jit函数所属的第三方库源码。
解决步骤
- 修改spec文件头的导入逻辑,新增所有包含JIT函数的第三方库导入:
# 原有导入保留,新增以下内容 import segmentation_models_pytorch as smp import lungmask
- 重写源码收集函数,递归收集所有包内的.py文件,替换你原有简单的
collect_source_files函数:
def collect_source_files(packages): datas = [] for pkg in packages: pkg_root = Path(inspect.getsourcefile(pkg)).parent pkg_parent_path = pkg_root.parent # 递归遍历包下所有py文件 for py_file in pkg_root.rglob("*.py"): rel_path = py_file.relative_to(pkg_parent_path) dest_dir = str(Path("src") / rel_path.parent) datas.append((str(py_file), dest_dir)) return datas
- 修改源码收集调用,传入所有需要带源码的包:
把原来的source_files = collect_source_files([torch])替换为:
source_files = collect_source_files([torch, efficientnet_pytorch, smp, lungmask])
- 在test.py开头添加运行时路径配置,让程序打包运行时能找到源码目录:
# 放在所有import的最前面 import sys from pathlib import Path # 判断是否是打包后的运行环境 if getattr(sys, 'frozen', False): src_root = str(Path(sys._MEIPASS) / "src") if src_root not in sys.path: sys.path.insert(0, src_root)
可选优化
你当前配置直接打包了完整的torch、torchvision目录,最终生成的可执行文件体积会非常大,解决报错后可以手动剔除不需要的算子、CUDA架构相关的冗余文件,缩减体积。
内容的提问来源于stack exchange,提问作者Ramin Nateghi
相关产品推荐
相关产品推荐

