Python自定义包中如何正确指定YAML文件的路径?
Python自定义包中如何正确指定YAML文件的路径?
嗨,这个问题我之前踩过一模一样的坑!你用相对路径找不到文件的核心原因是:当你把包安装到其他项目后,代码运行时的工作目录并不是你包所在的目录——那些./data.yml之类的相对路径,都是相对于当前运行脚本的工作目录来解析的,自然找不到包内的文件啦。
给你两种靠谱的解决方案,都是获取包内文件的绝对路径,彻底摆脱工作目录的影响:
方法一:用pathlib(推荐,现代Python风格)
在package/data/constants.py里,利用__file__变量(它指向当前脚本文件的绝对路径)来定位data.yml:
# package/data/constants.py from pathlib import Path # 获取当前constants.py所在的data目录的绝对路径 current_dir = Path(__file__).parent # 拼接出data.yml的绝对路径 DATA_PATH = current_dir / "data.yml"
然后在main.py里直接用这个路径就好:
# package/main/main.py from package.data.constants import DATA_PATH import yaml with open(DATA_PATH, 'r') as f: data = yaml.safe_load(f)
这种方法的好处是直观易懂,pathlib的路径拼接也比字符串拼接更可靠,而且不管你的包被安装到系统的哪个位置,这个路径都会是准确的。
方法二:用importlib.resources(适合Python 3.9+)
如果你用的是Python 3.9及以上版本,可以用标准库的importlib.resources来读取包内文件,甚至不需要手动处理路径:
# package/data/constants.py from importlib.resources import files # 获取data.yml的路径对象 DATA_PATH = files("package.data").joinpath("data.yml")
使用方式和上面一样,直接打开DATA_PATH即可。
关键提醒:别忘了把data.yml打包进安装包!
不管用哪种方法,你都需要确保data.yml在安装包的时候被一起复制过去,不然即使路径对了,文件也不存在。
如果你用setuptools,可以在pyproject.toml里加上:
[tool.setuptools.package-data] "package.data" = ["data.yml"]
如果用poetry,则在pyproject.toml里添加:
[tool.poetry] # 其他配置... include = ["package/data/data.yml"]
这样安装包的时候,data.yml就会被正确包含进去啦。
备注:内容来源于stack exchange,提问作者CSSer
相关产品推荐
相关产品推荐

