我想查找文件的分发。该文件应发现其自己的分发。
我试过了,但这行不通:
import os
import pkg_resources
for dist in pkg_resources.find_distributions(os.path.dirname(__file__)):
print dist
带有上述的文件是使用
pip install -e ...
安装的。我在文档中找不到解决方案:
https://pythonhosted.org/setuptools/pkg_resources.html#distribution-objects
解决方案不应包含软件包的字符串。它应该是通用的。
最佳答案
pkg_resources
分发API需要一个分发名称。这不一定与“当前”模块所使用的软件包名称相关。
以BeautifulSoup项目为例。当前版本使用bs4
作为包名,但是PyPI上的发行版名称是 beautifulsoup4
。
发行版也可以包含多个顶层程序包或模块。例如,pkg_resources
模块本身与setuptools
包一起是setuptools
发行版的一部分。
因此,您无法概括和使用__file__
或__package__
,希望始终获得相应的分布。
如果您的发行版是作为鸡蛋安装的(例如,使用easy_install
或zc.buildout
),则可以在路径中搜索.egg
扩展名,在该位置拆分路径,然后使用 Distribution.from_filename()
从中生成一个Distribution
对象;文件名包含所有必要的信息。但是,如果您的软件包是使用pip
安装的,则会创建一个单独的.egg-info
文件,并且您将返回第一个文件(无法找到发行名称)。
另一方面,您可以使用 Distribution
instance获得针对您的环境的所有pkg_resources.Environment()
对象;但您会遇到将现有发行版与给定模块或包匹配的同样问题,至少不能与公共(public)API匹配。您可以扫描所有发行版,并结合使用.location
属性(用于鸡蛋)和(私有(private))Distribution._provider
属性,以及(完全可选)installed-files.txt
元数据条目(如果可用,则包含相对路径(!))。让您扫描整个环境以寻找匹配的分布,但这完全取决于各种resource providers的内部实现细节。对于较大的安装,这可能是一个昂贵的搜索。
因此,最好的选择是仅使用硬编码的分发名称。
关于python - pkg_resources : get own distribution?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22610578/