相对于sys.path加载文件(不是python模块)的最佳方法

相对于sys.path加载文件(不是python模块)的最佳方法,python,import,Python,Import,我想从python路径(sys.path)的某个地方加载一个文件,方法与java中使用Class.getResourceAsStream()的方法类似。这个文件不是python模块,但我碰巧(ab)使用python打包实现了一个基本上包含JSON文件集合的repo 因此,需要明确的是,打包的数据除了setup.py文件之外不包含python。这是一个鸡蛋,里面没有蟒蛇。 使用打包数据的项目是带有python代码的项目 我使用pip install-e安装软件包。它最终出现在我的虚拟环境中/src

我想从python路径(
sys.path
)的某个地方加载一个文件,方法与java中使用
Class.getResourceAsStream()
的方法类似。这个文件不是python模块,但我碰巧(ab)使用python打包实现了一个基本上包含JSON文件集合的repo

因此,需要明确的是,打包的数据除了
setup.py
文件之外不包含python。这是一个鸡蛋,里面没有蟒蛇。 使用打包数据的项目是带有python代码的项目

我使用
pip install-e
安装软件包。它最终出现在我的虚拟环境中
/src/
。此位置显示为
sys.path
中的一个条目

是否有一个简单的ish库调用,可以让我找到一个这样的文件的绝对路径,而不必通过循环搜索
sys.path

比如:

path = find_in_sys_path('campaigns/get.json')
path = filter(lambda x: 'rbx-api-mocks' in x, sys.path)[0]
# rbx-api-mocks is the "egg name"
…实际上应该调用在系统路径中查找的任何内容。

签出设置工具

在阅读@larsmans之后,我意识到,尽管我的egg打包数据不包含任何python模块,我可以将其用作加载资源的参考,但我可以轻松地从
sys.path
找到它的绝对路径,如下所示:

path = find_in_sys_path('campaigns/get.json')
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')

我可能最终会这样做。

这很容易实现,但是您确定要搜索
sys.path
来查找它,而不是只选择需要资源的模块路径吗?如果另一个包包含同名的文件,则最终加载的文件是错误的。导入钩子?@larsmans我猜你的意思是“包含资源的模块”?。在我的例子中,资源位于一个完全不包含python代码的包中,我只是碰巧使用python打包。但是你的评论让我觉得我知道包的名称,所以我可以在sys.path中找到它的条目。看起来很有趣,但我不能使用它,因为我要做的是加载位于完全不同包中的资源。我在python项目中安装的“包”实际上不包含任何python,只包含json文件,因此我没有任何有意义的东西可以作为第一个参数传递。