【问题标题】:Associating modules and packages with its PyPI name将模块和包与其 PyPI 名称相关联
【发布时间】:2020-07-17 07:07:02
【问题描述】:

假设我们正在使用import xyz 导入一些名为xyz 的第三方包或模块(这不是像datetime 这样的“内置”)。 xyz 的 PyPI 名称通常相同,因此在 pip list 中会显示为 xyz。但是,据我所知,没有规定必须如此。例如,google-pasta 的模块名为 pasta

鉴于我是importing 的模块或包的名称,有没有办法确定它来自哪个 PyPI 包(除了猜测 PyPI 包并查看源代码)?相反,有没有办法知道给定 PyPI 安装将哪些包和模块引入命名空间?

【问题讨论】:

  • "给定我要导入的模块或包的名称" 你是否还假设包已实际安装?或者您是否还需要涵盖,例如,查找/继承一些代码,并且必须弄清楚要安装哪些软件包才能使其工作?请注意,实际的包名称不一定是唯一的,例如PIL 导入由 PILPillow pypi 包提供。
  • @MisterMiyagi,是的,请假设软件包已安装。最初,让我想到的是:我正在导入的这个模块有问题;也许升级会解决它?但要做到这一点,我需要找到要给 pip 的 PyPI 名称...

标签: python pip pypi python-packaging


【解决方案1】:

我相信类似以下的方法应该有效:

#!/usr/bin/env python3

import importlib.util
import pathlib

import importlib_metadata

def get_distribution(file_name):
    result = None
    for distribution in importlib_metadata.distributions():
        try:
            relative = (
                pathlib.Path(file_name)
                .relative_to(distribution.locate_file(''))
            )
        except ValueError:
            pass
        else:
            if relative in distribution.files:
                result = distribution
    return result

def alpha():
    file_name = importlib.util.find_spec('easy_install').origin
    distribution = get_distribution(file_name)
    print("alpha", distribution.metadata['Name'])

def bravo():
    file_name = importlib_metadata.__file__
    distribution = get_distribution(file_name)
    print("bravo", distribution.metadata['Name'])

if __name__ == '__main__':
    alpha()
    bravo()

【讨论】:

  • sinoroc,谢谢你 - 我会检查你的代码。
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多