Как узнать, какому пакету pip принадлежит файл?

У меня есть файл, который я подозреваю, был установлен с помощью pip. Как я могу найти, в каком пакете установлен этот файл?

Другими словами, я ищу команду, аналогичную pacman -Qo filename или dpkg -S filename, но для pip. Это существует? Или я должен использовать какую-то комбинацию pip и grep? В этом случае я не знаю, как перечислить все установленные файлы.

Ответ 1

Вы можете попробовать с

pip list | tail -n +3 | cut -d" " -f1 | xargs pip show -f | grep "filename"

Затем ищите результаты, ища этот файл.

Ответ 2

Вы можете использовать скрипт Python, как это:

#!/usr/bin/env python

import sys
try:
    from pip.utils import get_installed_distributions
except ModuleNotFoundError:
    from pip._internal.utils.misc import get_installed_distributions

MYPATH=sys.argv[1]
for dist in get_installed_distributions():
    # RECORDs should be part of .dist-info metadatas
    if dist.has_metadata('RECORD'):
        lines = dist.get_metadata_lines('RECORD')
        paths = [l.split(',')[0] for l in lines]
    # Otherwise use pip log for .egg-info's
    elif dist.has_metadata('installed-files.txt'):
        paths = dist.get_metadata_lines('installed-files.txt')
    else:
        paths = []

    if MYPATH in paths:
        print(dist.project_name)

Использование выглядит так:

$ python lookup_file.py requests/__init__.py 
requests

Я написал более полную версию здесь, с абсолютными путями:

https://github.com/nbeaver/pip_file_lookup

Ответ 3

Попробуйте это!

find_pkg_by_filename(){ for pkg in $(pip list | cut -d" " -f1) ; do if pip show -f "$pkg" | grep "$1" ; then echo "=== Above files found in package $pkg ===" ; fi ; done ; }

find_pkg_by_filename somefilename

Обратите внимание, что если вы добавите -q в grep, он выйдет, как только появится совпадение, а затем pip будет жаловаться на сломанные трубы.