我想找到一个文件的分布。该文件应该发现它自己的分布。
我试过了,但是不行:
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__
并希望始终获得相应的分布。
如果您的发行版是作为 egg 安装的(例如使用 easy_install
或 zc.buildout
),那么您可以搜索 .egg
路径中的扩展名,在该位置拆分路径并使用 Distribution.from_filename()
从中生成一个 Distribution
对象;文件名包含所有必要的信息。但是,如果您的包是使用 pip
安装的,则会创建一个单独的 .egg-info
文件,您又回到了原点(无法找到分发名称)。
另一方面,您可以使用 pkg_resources.Environment()
instance 为您的环境获取所有 Distribution
对象;但是您会遇到将现有发行版与给定模块或包匹配的相同问题,至少不会遇到公共(public) API。您可以扫描所有分布,.location
属性(对于鸡蛋)和(私有(private))Distribution._provider
属性的组合以及(完全可选)installed-files.txt
元数据条目(如果可用,包含相对路径(!))的存在将让您扫描整个环境以寻找匹配的分发,但这完全是取决于各种 resource providers 的内部实现细节.而且它可能是一个昂贵的搜索,当然对于更大的安装。
因此,您最好的选择是只使用硬编码的分发名称。
关于python - pkg_resources : get own distribution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22610578/