我不明白 pkg_resource.resource_filename() 究竟是如何工作的,它的参数是什么。我在网上搜索了很多,但他们的官方文档并没有很好地涵盖它。有人可以解释一下吗?
问问题
4862 次
1 回答
4
这里有一些例子。我在旧环境中安装了 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
是因为路径上可能有相同包的多个版本的鸡蛋,并且pkg_resources
会添加请求的版本,但此功能不再使用太多。
这些示例非常简单,但resource_filename
如果您的资源位于.zip
文件或任何其他受支持的导入位置中,也可以使用(可以挂钩 Python 的导入系统,以便导入来自任何地方 - sqlite 数据库、网络,...,和如果安装了正确的钩子,resource_filename 应该能够使用这些。)
于 2019-03-06T22:06:31.420 回答