我想找到一个文件的分布。该文件应该发现自己的发行版。
我尝试了这个,但这不起作用:
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
解决方案不应包含包的字符串。它应该是通用的。
答案 0 :(得分:5)
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
文件而您将返回到方框1(没有可分发的分发名称)。
在另一个方向,您可以使用pkg_resources.Environment()
instance为您的环境获取所有Distribution
个对象;但是你会遇到将现有发行版匹配到给定模块或包的相同问题,至少不会使用公共API。您可以扫描所有分布,.location
属性(用于鸡蛋)和(私有)Distribution._provider
属性的组合以及(完全可选的){{{ 1}}元数据条目(如果可用,包含相对路径(!))将允许您扫描整个环境以获得匹配的分发,但这完全取决于各种resource providers的内部实现细节。它可能是一个昂贵的搜索,当然对于大型安装。
因此,您最好的选择是使用硬编码的分发名称。