如何在Python模块内部正确引用存放在模块目录下的数据资产文件
模块内部引用同目录资产文件的解决方案
方法1:基于__file__属性拼接路径(全Python版本兼容)
这种方法不需要依赖额外的标准库特性,Python3.x全版本可用:
import os import json # 取当前模块文件的绝对路径,再提取所在目录 module_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到资产文件的绝对路径 asset_path = os.path.join(module_dir, "myasset.json") # 正常读取即可 with open(asset_path, "r", encoding="utf-8") as f: data = json.load(f)
方法2:使用importlib.resources(Python3.9+推荐)
这是Python官方推荐的包资源访问方式,不需要手动处理路径拼接,适配打包、虚拟环境等各类场景:
from importlib.resources import files import json # 直接从当前包下读取资产文件内容 asset_content = files(__package__).joinpath("myasset.json").read_text(encoding="utf-8") data = json.loads(asset_content)
注意事项
- 如果你需要将模块打包发布,必须在打包配置中声明包含资产文件,否则安装后资产文件不会被同步到包目录:
例如在pyproject.toml中添加配置:include = ["mymodule/*.json"] - 不要使用相对路径直接读取、也不要基于
os.getcwd()拼接路径,这两者都依赖运行脚本时的工作目录,和模块本身的存储位置无关,会出现跨环境读取失败的问题。
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

