python中pkg_resource中resource_filename的参数

Parameters of resource_filename in pkg_resource in python

我不明白 pkg_resource.resource_filename() 究竟是如何工作的,它的参数是什么。我在网上搜索了很多,但他们的官方文档并没有很好地涵盖它。有人可以解释一下吗?

这里有几个例子。我在旧环境中安装了 wheel 0.24:

pkg_resources.resource_filename('spamalot', "wheel/__init__.py")    
ImportError: No module named spamalot

第一个参数必须是可导入的。第二个参数应该是相对的、/ 分隔的路径,包括在使用 \ 分隔路径的系统上。

In [27]: pkg_resources.resource_filename('distutils', "wheel/__init__.py")
Out[27]: '/opt/pyenv/lib64/python2.7/distutils/wheel/__init__.py'

如果是可导入的,你会在导入的名称中得到一个路径。在这种情况下,文件是否存在并不重要。

In [28]: pkg_resources.resource_filename(pkg_resources.Requirement.parse('wheel>0.23.0'), "core.py")
Out[28]: '/opt/pyenv/lib/python2.7/site-packages/core.py'

你可以通过一个要求,它会检查你是否真的安装了它。现在路径是相对于安装目录而不是 wheel 包。

In [29]: pkg_resources.resource_filename(pkg_resources.Requirement.parse('wheel>0.27.0'), "core.py")

VersionConflict: (wheel 0.24.0 (/opt/pyenv/lib/python2.7/site-packages), Requirement.parse('wheel>0.27.0'))

如果没有安装要求,它会抱怨。

Requirement 特性存在的一个原因是因为路径上可能有同一个包的多个版本的 egg,并且 pkg_resources 将添加请求的版本,但这个特性不是已经不用很多了。

这些示例非常简单,但如果您的资源位于 .zip 文件或任何其他受支持的导入位置(可以挂钩 Python' s 导入系统,以便从任何地方导入 - sqlite 数据库、网络、...,如果安装了正确的挂钩,resource_filename 应该能够使用这些。)