将模块和软件包与其PyPI名称关联

问题描述 投票:0回答:1

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

给出我正在import的模块或包的名称,是否有办法确定它来自哪个PyPI包(除了猜测PyPI包并查看源代码之外)?相反,有没有办法知道给定的PyPI安装将哪些软件包和模块引入了名称空间?

python pip pypi python-packaging
1个回答
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()
© www.soinside.com 2019 - 2024. All rights reserved.