pkg_resources:获得自己的发行版?

时间:2014-03-24 13:18:11

标签: python package

我想找到一个文件的分布。该文件应该发现自己的发行版。

我尝试了这个,但这不起作用:

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

解决方案不应包含包的字符串。它应该是通用的。

1 个答案:

答案 0 :(得分:5)

pkg_resources分发API需要分发名称;这不一定与包名称当前'相关联。模块正在运行。

以BeautifulSoup项目为例。当前版本使用bs4作为包名称,但PyPI上的分发名称beautifulsoup4

分发包也可以包含多个顶级包或模块;例如,pkg_resources模块本身是setuptools发行版的一部分,与setuptools包一起发布。

因此,您无法概括并使用__file____package__,并希望始终获得相应的分发。

如果您的发行版安装为鸡蛋(例如,使用easy_installzc.buildout),那么您可以在路径中搜索.egg扩展名,在该位置拆分路径并使用Distribution.from_filename()从中生成Distribution个对象;文件名包含所有必要的信息。如果您的软件包是使用pip安装的,则会创建一个单独的.egg-info文件而您将返回到方框1(没有可分发的分发名称)。

在另一个方向,您可以使用pkg_resources.Environment() instance为您的环境获取所有Distribution个对象;但是你会遇到将现有发行版匹配到给定模块或包的相同问题,至少不会使用公共API。您可以扫描所有分布,.location属性(用于鸡蛋)和(私有)Distribution._provider属性的组合以及(完全可选的){{{ 1}}元数据条目(如果可用,包含相对路径(!))将允许您扫描整个环境以获得匹配的分发,但这完全取决于各种resource providers的内部实现细节。它可能是一个昂贵的搜索,当然对于大型安装。

因此,您最好的选择是使用硬编码的分发名称。