相对sys.path加载文件的最佳方法

2 投票
2 回答
595 浏览
提问于 2025-04-19 05:53

我想从 Python 的路径中加载一个文件,类似于 Java 中的 Class.getResourceAsStream() 方法。不过这个文件并不是一个 Python 模块,而是我在用 Python 的打包方式来管理的一些 JSON 文件。

为了说明清楚,这些打包的数据里除了一个 setup.py 文件外,没有其他的 Python 代码。可以说这是一个里面没有 Python 的包。使用这些打包数据的项目才是有 Python 代码的。

我用 pip install -e <git URL> 来安装这个包。安装后,它会放在我的虚拟环境中,路径是 <env_path>/src/<repo>。这个位置会出现在 sys.path 的列表里。

我想知道有没有简单的库调用,可以让我找到这个文件的绝对路径,而不需要我一个一个地去查找 sys.path 中的文件。

就像这样:

path = find_in_sys_path('campaigns/get.json')

...不管 find_in_sys_path 实际上应该叫什么。

2 个回答

0

在阅读了@larsmans的评论后,我意识到虽然我的数据是以egg包的形式打包的,并没有可以用来加载资源的Python模块,但我可以很容易地从sys.path中找到它的绝对路径,方法是:

path = filter(lambda x: 'rbx-api-mocks' in x, sys.path)[0]
# rbx-api-mocks is the "egg name"

然后我可以用这个路径来构建资源的路径,方法是:

resource = os.path.join(path, 'campaigns', 'campaign', 'query.json')

我可能最终会选择这个方法。

0

去看看 setuptools 的文档,特别是关于资源管理器的部分,链接在这里:https://pythonhosted.org/setuptools/pkg_resources.html#resourcemanager-api

import pkg_resources
my_data = pkg_resources.resource_string(__name__, "campaigns/get.json")

撰写回答