相对sys.path加载文件的最佳方法
我想从 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")