tl;dr, как мне узнать, какой пакет установил точку входа скрипта в каталоге Scripts
?
Учитывая среду Python по пути Python
, она имеет каталог точек входа скриптов по адресу Python/Scripts
. Для сценария Python/Scripts/foo.py
как узнать, какой пакет Python установлен foo.py
?
Или, другими словами, как мне «обратный поиск» точек входа скрипта Python?
🤔 А знаете ли вы, что...
Python активно используется в научных и инженерных вычислениях.
Вы можете перечислить все файлы, принадлежащие данному пакету, с помощью 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']