我想查找文件的分发。该文件应发现其自己的分发。

我试过了,但这行不通:

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_installzc.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/

10-12 20:00