在pyproject.toml指定路径后如何访问Python包数据?
修复setuptools打包后无法加载
mypkg.models子包的问题 问题根源
ModuleNotFoundError: No module named 'mypkg.models' 表明mypkg.models子包未被正确纳入打包产物。尽管已为子包添加__init__.py,但默认的包发现规则可能未递归识别到该子包,导致打包时遗漏。
修复方案
1. 修正pyproject.toml的包发现配置
修改包查找规则,确保递归包含所有mypkg相关子包:
[tool.setuptools.packages.find] where = ["."] include = ["mypkg*"]
where = ["."]指定从项目根目录开始扫描包include = ["mypkg*"]匹配mypkg及其所有层级的子包
2. 优化运行时加载逻辑
改用importlib.resources.files API(比path更适配打包后的wheel/egg场景),同时通过相对导入避免字符串包名出错:
import joblib from importlib.resources import files from . import models def load_model(filename): model_path = files(models).joinpath(filename) return joblib.load(model_path) saved_model = load_model("model1.pkl")
若需保留原函数的字符串包名形式,需显式导入子包确保其被识别:
import importlib.resources import joblib import mypkg.models # 显式导入子包,触发模块注册 def load_model(package, filename): with importlib.resources.path(package, filename) as file_path: return joblib.load(file_path) saved_model = load_model('mypkg.models', 'model1.pkl')
3. 重新打包安装
先清理旧安装版本:
pip uninstall -y mypkg
再重新打包并安装(推荐生成wheel包模拟正式环境):
python -m build pip install dist/*.whl
内容的提问来源于stack exchange,提问作者morepenguins
相关产品推荐
相关产品推荐

