Связывание модулей и пакетов с его именем PyPI - PullRequest
0 голосов
/ 05 апреля 2020

Скажем, мы импортируем какой-то сторонний пакет или модуль с именем xyz (это не "встроенный", как datetime) с import xyz. PyPI-имя xyz обычно совпадает с именем xyz в pip list. Однако, насколько я знаю, не существует правила, которое гласит, что так должно быть; например, google-pasta имеет свой модуль с именем pasta.

Учитывая имя модуля или пакета, я import ing, есть ли способ определить, какой пакет PyPI это произошло (кроме угадывания пакета PyPI и просмотра исходного кода)? И наоборот, есть ли способ определить, какие пакеты и модули данная установка PyPI представляет в пространство имен?

1 Ответ

1 голос
/ 05 апреля 2020

Я считаю, что что-то вроде следующего должно работать:

#!/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()
...