Узнать, какой пакет установил точку входа сценария Python?

tl;dr, как мне узнать, какой пакет установил точку входа скрипта в каталоге Scripts?

Учитывая среду Python по пути Python, она имеет каталог точек входа скриптов по адресу Python/Scripts. Для сценария Python/Scripts/foo.py как узнать, какой пакет Python установлен foo.py?

Или, другими словами, как мне «обратный поиск» точек входа скрипта Python?

🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.


1
50
1

Ответ:

Решено

Вы можете перечислить все файлы, принадлежащие данному пакету, с помощью importlib.metadata.files(<package_name>). После этого написать скрипт, чтобы определить, к какому пакету принадлежит файл, довольно просто:

import importlib.metadata

def find_file_pkg(file_path):
    for p in importlib.metadata.packages_distributions():
        try:
            for f in importlib.metadata.files(p):
                if file_path in str(f):
                    return p
        except importlib.metadata.PackageNotFoundError:
            pass
    return None

if __name__ == '__main__':
    print(find_file_pkg('Scripts/foo.py'))

Редактировать/Примечание: обычно рекомендуется устанавливать исполняемые файлы как EntryPoints. Сначала я заметил, что ваша точка входа — это файл .py, и предложил следующий ответ:

Я не уверен, что pip позволяет это, но вы можете сделать это с помощью Python importlib.metadata. Сначала выясните, какой модуль/функция запускается foo.exe с помощью:

import importlib.metadata
importlib.metadata.entry_points().select(name='foo')

Он выведет что-то вроде:

[EntryPoint(name='foo', value='foo_module:foo_function', group='console_scripts')]

Затем вы получаете дистрибутив пакета с помощью:

importlib.metadata.packages_distributions()['foo_module']