【问题标题】:pkg_resources: get own distribution?pkg_resources:获得自己的分配?
【发布时间】:2014-05-01 21:05:56
【问题描述】:

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

我试过了,但这不起作用:

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

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

【问题讨论】:

    标签: python package


    【解决方案1】:

    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 对象;但是您会遇到将现有发行版与给定模块或包匹配的相同问题,至少在使用公共 API 时不会。您可以扫描所有分布,.location 属性(用于鸡蛋)和(私有)Distribution._provider 属性的组合以及(完全可选)installed-files.txt 元数据条目的存在(如果可用,包含相对路径(!))可以让您扫描整个环境以查找匹配的分布,但这完全取决于各种resource providers 的内部实现细节。这可能是一个昂贵的搜索,当然对于更大的安装。

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

    【讨论】:

    • 好吧,走向“另一个方向”,对于每个发行版,您可能会在 .get_metadata('top_level.txt') 获得所有顶级软件包,至少对于 pip 安装的软件包。
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2017-01-20
    • 2020-01-17
    • 2020-09-05
    • 2021-12-27
    • 2021-10-11
    • 2019-10-20
    • 2014-04-11
    相关资源
    最近更新 更多