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

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


person Jürgen A. Erhard    schedule 06.07.2011    source источник
comment
По теме: Список установленных пакетов сайта python?   -  person Piotr Dobrogost    schedule 12.11.2011


Ответы (18)


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

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

person Community    schedule 06.07.2011
comment
Начиная с версии 1.3 был добавлен список пунктов. См. Мой ответ ниже и документы здесь: pip-installer.org /en/latest/usage.html#pip-list - person keybits; 26.05.2013
comment
список и заморозить вывод в разных форматах (на момент написания). Вывод замораживания можно использовать для воссоздания сред: docs.python -guide.org/en/latest/dev/virtualenvs/#other-notes - person Tom Saleeba; 19.02.2016
comment
pip freeze и pip list перечисляют все. Они не исключают пакеты, которые не были установлены pip. - person Eliad; 15.12.2016
comment
Я также считаю, что pip freeze надежен в сценариях, тогда как pip list будет генерировать неожиданные ошибки при использовании с каналами. - person Dale Anderson; 18.01.2017
comment
Новый (?) pip list -l или pip list --local - лучший ответ, см. stackoverflow.com/a/43012269/491884 от @MJB - person jmuc; 02.05.2017
comment
Это не отвечает на вопрос: перечислить пакеты, установленные PIP, но НЕ установленные с пакетами дистрибутива - person Luis Vazquez; 08.05.2020

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

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

person keybits    schedule 26.05.2013
comment
В Gentoo здесь перечислены все пакеты, даже те, которые были установлены другим способом, кроме pip. Действительно ли это исключает модули, установленные без pip, в другой системе, как того требует вопрос? - person jlh; 14.04.2017
comment
Обратите внимание, что это немного отличается от pip freeze - person s g; 28.07.2017
comment
pip list --user показывает только пакеты, установленные пользователем, и исключает общесистемные пакеты. - person Jacob Hume; 06.03.2020

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

pip show [options] <package>

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

person Daniel Sikes    schedule 24.10.2014

Начнем с:

$ pip list

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

$ pip show <package-name>

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

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

Пример:

$ 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    
person ng10    schedule 05.06.2017
comment
Лучший ответ ИМХО. Действительно просто и быстро, если я знаю название пакета. pip list даже не нужен, и замораживание может занять много времени, и мне нужно отфильтровать вещи, которые меня не волнуют. Просто: pip show my_packge - person ChuckZ; 22.08.2018

Если 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, который является каталогом, в который устанавливается pip, YMMV. pacman -Qo - это то, как pac kage man ager Arch проверяет право собственности на файл. No package является частью возврата, который он дает, если ни один пакет не владеет файлом: error: No package owns $FILENAME. Сложный обходной путь: я спрашиваю о __init__.py, потому что pacman -Qo немного не разбирается в каталогах :(

Чтобы сделать это для других дистрибутивов, вам нужно выяснить, где pip устанавливает что-то (просто sudo pip install что-то), как запросить право собственности на файл (метод Debian / Ubuntu - dpkg -S) и что такое «ни один пакет не владеет этим путем» return (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'
person Capi Etheriel    schedule 22.02.2013
comment
+1 Большое спасибо за однострочник Arch, это именно то, что я искал. Кстати, любопытный факт: моя установка Arch локализована на итальянском языке, но grep правильно «обработал» строки, в которых говорилось «Nessun pacchetto» (итальянский язык означает «Нет пакета»), хотя я использовал grep для «Нет пакета». Как придешь? - person Nadir Sampaoli; 17.04.2013
comment
@barraponto @NadirSampaoli grep в моем случае ничего не делает. Потому что grep пытается использовать grep в stdout, но dpkg записывает ошибку в stderr, поэтому мне нужно добавить перенаправление 2>&1. А для международного вывода добавьте LANG= перед xargs dpkg -s. и sed - тоже хороший инструмент;) чтобы сохранить только имя пакета пути. Итак, я получаю: find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/" - person David Boho; 13.11.2015
comment
привет, я проголосовал против по ошибке и только что понял это, и теперь мой голос заблокирован. Может ли кто-нибудь проголосовать за это, чтобы нейтрализовать мой голос против? Спасибо - person Jonathan; 02.10.2016

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's in /usr/XXX
    print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
person yegle    schedule 21.01.2014
comment
Это больше не будет работать. См. github.com/pypa/pip/issues/5243 Вместо этого вы должны использовать: import pkg_resources [print (d.project_name) для d в pkg_resources.working_set] - person Almenon; 15.07.2018

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

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

person MJB    schedule 25.03.2017
comment
оказывается, у нас было pip freeze --local в течение 8 лет. pip list --local тоже доступен ... но обратите внимание, что вопрос OP касается не виртуальных сред (которые --local поддерживает), а отличия пакетов дистрибутива от sudo pip install пакетов. - person Capi Etheriel; 02.07.2017

Приведенный ниже список немного медленен, но дает хорошо отформатированный список пакетов, о которых знает pip. То есть не все из них были установлены «с помощью» pip, но все они должны иметь возможность обновляться с помощью pip.

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

Причина, по которой он медленный, заключается в том, что он перечисляет содержимое всего репозитория pypi. Я подал запрос, предлагающий 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)
$
person MarkHu    schedule 24.10.2012
comment
Почему бы не оформить билет самостоятельно? - person lajarre; 06.02.2013
comment
Очевидно, в следующей версии pip будет новая команда списка: pip -installer.org/en/latest/usage.html#pip-list - person MarkHu; 08.02.2013

Добавляя к ответу @Paul Woolcock,

pip freeze > requirements.txt

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

pip install -r requirements.txt

установит пакеты, указанные в файле требований.

person All Іѕ Vаиітy    schedule 03.01.2017

Обратите внимание: если на вашем компьютере установлено несколько версий 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.

person ntk4    schedule 24.09.2016
comment
pip - для python2.7, pip3 - для python3.x - person mjp; 22.05.2017

Как отметил @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])

I'm on v3.6.5

person mscheker    schedule 12.04.2019

Вот однострочный вариант для 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:'
person eddygeek    schedule 24.03.2014

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

person Ignacio Vazquez-Abrams    schedule 06.07.2011

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

person user3013438    schedule 20.11.2013

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

user@pc:~ $ 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):

user@pc:~ $ 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, если необходимо):

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

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

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

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

person C S    schedule 19.05.2018

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

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
person Ed K    schedule 15.10.2018

pip list [options] Вы можете увидеть полную справку здесь

person ron33    schedule 30.12.2019
comment
Это то же самое, что и 2-й по количеству голосов ответ. - person Gino Mempin; 31.12.2019

По крайней мере, для 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
person keypress    schedule 05.04.2018