python - pkg_resources : get own distribution?

标签 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

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

最佳答案

pkg_resources 分发 API 需要一个分发名称;这不一定与“当前”模块在其下运行的包名称相关。

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

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

因此,您不能概括和使用__file____package__ 并希望始终获得相应的分布。

如果您的发行版是作为 egg 安装的(例如使用 easy_installzc.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/

相关文章:

python - 存储大字符串的正确 SQLAlchemy 类型是什么?

python - 如何更好的基于配置文件实例化不同的子类?

python - python 导入应该花这么长时间吗?

python - 采用节点网络并插入缺失值的最佳方法

python - 如何使用正则表达式在 python 中的关键字列表之后提取单词?

Java导入包(打包到当前工作目录之上)

android - 以编程方式获取 PNG 或 BMP 格式的 Android 包图标

wolfram-mathematica - 设计方法 : Overloading vs Switch?

r - 由于包依赖性,R CMD 检查出错

r - 当条件不满足时跳过所有测试