如何用PyInstaller打包MLflow项目并解决ml-package-versions.yml缺失问题
解决PyInstaller打包MLflow项目时缺失ml-package-versions.yml的问题
问题背景
我用Typer构建了一个依赖MLflow做实验追踪的项目,用PyInstaller打包成exe后,运行时总是提示ml-package-versions.yml文件缺失,错误指向PyInstaller解压的临时目录。直接运行Python脚本一切正常,但打包时这个文件没被包含进去。MLflow读取该文件的逻辑位于versioning.py的第62行附近,试过在干净的conda/虚拟环境中打包,问题依旧。
可行解决方案
方法1:通过PyInstaller的.spec文件强制包含资源文件
- 找到MLflow安装目录下的
ml-package-versions.yml,虚拟环境中的路径通常是Lib\site-packages\mlflow\ml-package-versions.yml - 生成PyInstaller的spec文件:
pyi-makespec main.py - 编辑生成的
main.spec文件,在datas列表中添加文件路径映射:datas=[ # 替换为你实际的yml文件路径 ("path/to/ml-package-versions.yml", "mlflow"), ] - 用spec文件重新打包:
pyinstaller main.spec
方法2:修改MLflow读取文件的逻辑(临时补丁)
在项目导入MLflow之前,添加代码手动指定yml文件路径:
import os import mlflow.utils.autologging_utils.versioning # 假设yml文件放在exe同目录下 def patched_load_version_file(): yml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ml-package-versions.yml") with open(yml_path, "r") as f: import yaml return yaml.safe_load(f) # 替换原读取函数 mlflow.utils.autologging_utils.versioning._load_version_file_as_dict = patched_load_version_file # 之后再导入MLflow import mlflow
打包后需将ml-package-versions.yml放在exe同一目录下。
方法3:使用PyInstaller的--add-data参数直接打包
无需生成spec文件,直接在打包命令中指定:
# Windows系统用分号分隔路径 pyinstaller --add-data "path/to/ml-package-versions.yml;mlflow" main.py # Linux/macOS系统用冒号分隔路径 pyinstaller --add-data "path/to/ml-package-versions.yml:mlflow" main.py
报错栈信息
Traceback (most recent call last): File "main.py", line 2, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "app.py", line 14, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "database_manager.py", line 9, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "dni\modeling\active_learning\predict_single.py", line 9, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "mlflow\__init__.py", line 32, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "mlflow\tracking\__init__.py", line 20, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "mlflow\tracking\fluent.py", line 27, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "mlflow\utils\autologging_utils\__init__.py", line 27, in <module> File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module File "mlflow\utils\autologging_utils\versioning.py", line 67, in <module> File "mlflow\utils\autologging_utils\versioning.py", line 63, in _load_version_file_as_dict FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\[USERNAME]\\AppData\\Local\\Temp\\_MEI92042\\mlflow\\ml-package-versions.yml' [24704] Failed to execute script 'main' due to unhandled exception!
内容的提问来源于stack exchange,提问作者eetuko
相关产品推荐
相关产品推荐

