Найти все пакеты, установленные с помощью easy_install/pip?

Есть ли способ найти все пакеты PyPI Python, которые были установлены с помощью easy_install или pip? Я имею в виду, исключая все, что было/установлено с инструментами дистрибутивов (в данном случае apt-get на Debian).

Ответ 1

pip freeze выведет список установленных пакетов и их версий. Он также позволяет вам записывать эти пакеты в файл, который впоследствии может быть использован для настройки новой среды.

https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze

Ответ 2

Начиная с версии 1.3 пипа теперь вы можете использовать pip list

В нем есть несколько полезных опций, включая возможность отображения устаревших пакетов. Здесь документация: https://pip.pypa.io/en/latest/reference/pip_list/

Ответ 3

Если кому-то интересно, вы можете использовать команду "show show".

pip show [options] <package>

Здесь будет указан каталог установки данного пакета.

Ответ 4

Если Debian ведет себя как недавние версии Ubuntu в отношении целевого объекта pip install по умолчанию, он мертв легко: он устанавливается на /usr/local/lib/ вместо /usr/lib (apt по умолчанию). Проверьте https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Я являюсь пользователем ArchLinux, и, когда я экспериментировал с pip, я встретил эту же проблему. Вот как я решил это в Arch.

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'

Ключ здесь /usr/lib/python2.7/site-packages, который устанавливает патч каталога в YMMV. pacman -Qo заключается в том, как Arch pac kage man проверяет наличие права на файл. No package является частью возвращаемого им значения, когда пакет не владеет файлом: error: No package owns $FILENAME. Трудное обходное решение: я запрашиваю __init__.py, потому что pacman -Qo немного незначителен, когда дело касается каталогов: (

Чтобы сделать это для других дистрибутивов, вам нужно выяснить, где pip устанавливает материал (просто sudo pip install что-то), как запросить право собственности на файл (метод Debian/Ubuntu - dpkg -S) и что это "нет пакета, которому принадлежит этот путь" (Debian/Ubuntu - no path found matching pattern). Debian/Ubuntu, будьте осторожны: dpkg -S не удастся, если вы дадите ему символическую ссылку. Сначала разрешите его, используя realpath. Вот так:

find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'

Пользователи Fedora могут попробовать (спасибо @eddygeek):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Ответ 5

Начните с:

$ pip list

Перечислить все пакеты. Когда вы найдете нужный пакет, используйте:

$ pip show <package-name>

Здесь будут показаны сведения об этом пакете, включая его папку. Вы можете пропустить первую часть, если вы уже знаете имя пакета

Нажмите здесь для получения дополнительной информации о pip show и здесь для получения дополнительной информации о списке пикетов.

Пример:

$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: [email protected]
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    

Ответ 6

Ниже приведено несколько медленное, но оно дает красиво отформатированный список пакетов, о которых известно pip. То есть не все из них были установлены "по", но все они должны быть обновлены с помощью pip.

$ pip search . | egrep -B1 'INSTALLED|LATEST'

Причина, по которой она медленная, заключается в том, что она содержит список всего pypi repo. Я подал билет, предлагая pip list предоставлять аналогичную функциональность, но более эффективно.

Пример вывода: (ограничил поиск подмножеством вместо '.' для всех.)

$ pip search selenium | egrep -B1 'INSTALLED|LATEST'

selenium                  - Python bindings for Selenium
  INSTALLED: 2.24.0
  LATEST:    2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
  INSTALLED: 1.0.1 (latest)
$

Ответ 7

pip.get_installed_distributions() предоставит список установленных пакетов

import pip
from os.path import join

for package in pip.get_installed_distributions():
    print(package.location) # you can exclude packages that in /usr/XXX
    print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package

Ответ 8

Обратите внимание, что если на вашем компьютере установлено несколько версий Python, у вас может быть несколько версий pip, связанных с каждым.

В зависимости от ваших ассоциаций вам может потребоваться очень осторожно использовать команду pip:

pip3 list 

Работал для меня, где я запускаю Python3.4. Просто с помощью pip list появилась ошибка The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.

Ответ 9

Добавление в ответ @Paul Woolcock,

$ pip freeze > requirements.txt

создаст файл требований со всеми установленными пакетами в активной среде в текущем местоположении, которое вы можете запустить

$ pip install -r requirements.txt

для установки требований в другой среде.

Ответ 10

Более новые версии pip имеют возможность делать то, что хочет OP   список пиков -l или pip freeze -l. В Debian (по крайней мере) man-страница не делает это ясным, и я только открыл ее - в предположении, что функция должна существовать - с пунктом списка pip --help.

Есть недавние комментарии, которые предполагают, что эта функция не очевидна ни в документации, ни в существующих ответах (хотя некоторые намекали), поэтому я думал, что должен опубликовать. Я бы предпочел сделать это в качестве комментария, но у меня нет точек репутации.

Ответ 11

Вот однострочный файл для fedora или других rpm-дистрибутивов (на основе советов @barraponto):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Приложите это к предыдущей команде, чтобы получить более чистый результат:

 | sed -r 's:.*/(\w+)/__.*:\1:'

Ответ 12

Получите все имена файлов/папок в site-packages/dist-packages/, если они есть), и используйте диспетчер пакетов, чтобы лишить те, которые были установлены через пакет.

Ответ 13

pip freeze перечисляет все установленные пакеты, даже если не pip/easy_install. В CentOs/Redhat найден пакет, установленный через rpm.

Ответ 14

Для тех, у кого не установлен pip, я нашел этот быстрый скрипт на github (работает с Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]

Ответ 15

По крайней мере, для Ubuntu (может быть, и других) это работает (вдохновленный предыдущим сообщением в этой теме):

printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo

Ответ 16

Если вы используете дистрибутив python Anaconda, вы можете использовать команду conda list чтобы узнать, что было установлено каким способом:

[email protected]:~ $ conda list
# packages in environment at /anaconda3:
#
# Name                    Version                   Build  Channel
_ipyw_jlab_nb_ext_conf    0.1.0            py36h2fc01ae_0
alabaster                 0.7.10           py36h174008c_0
amqp                      2.2.2                     <pip>
anaconda                  5.1.0                    py36_2
anaconda-client           1.6.9                    py36_0

Чтобы захватить записи, установленные в pip (включая, возможно, сам pip):

[email protected]:~ $ conda list | grep \<pip
amqp                      2.2.2                     <pip>
astroid                   1.6.2                     <pip>
billiard                  3.5.0.3                   <pip>
blinker                   1.4                       <pip>
ez-setup                  0.9                       <pip>
feedgenerator             1.9                       <pip>

Конечно, вы, вероятно, хотите просто выбрать первый столбец, с которым вы можете справиться (за исключением, если нужно, pip):

[email protected]:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp        
astroid
billiard
blinker
ez-setup
feedgenerator 

Наконец, вы можете захватить эти значения и удалить все из них, используя следующее:

[email protected]:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

Обратите внимание на использование флага -y для pip uninstall чтобы избежать необходимости давать подтверждение для удаления.

Ответ 17

Как отметил @almenon, это больше не работает, и это не поддерживаемый способ получения информации о пакете в вашем коде. Следующее вызывает исключение:

import pip
installed_packages = dict([(package.project_name, package.version) 
                           for package in pip.get_installed_distributions()])

Для этого вы можете импортировать pkg_resources. Вот пример:

import pkg_resources
installed_packages = dict([(package.project_name, package.version)
                           for package in pkg_resources.working_set])

Я на v3.6.5