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

400

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

Юрген А. Эрхард
источник

Ответы:

381

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

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

TheodorosPloumis
источник
89
Начиная с версии 1.3 был добавлен «список пипсов». Смотрите мой ответ ниже и документы здесь: pip-installer.org/en/latest/usage.html#pip-list
keybits
7
перечислить и заморозить вывод различных форматов (на момент написания). Вывод замораживания можно использовать для воссоздания окружения: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Том Салеба,
18
pip freezeи pip listперечислить все. Они не исключают пакеты, которые не были установлены pip.
Элиад
Я также нахожу pip freezeнадежным в сценариях, в то время как pip listгенерирует неожиданные ошибки при использовании с каналами.
Дейл Андерсон
2
(?) Новый pip list -lили pip list --localлучший ответ, см stackoverflow.com/a/43012269/491884 по @MJB
jmuc
255

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

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

keybits
источник
3
В Gentoo, здесь перечислены все пакеты, даже те, которые установлены другими способами, кроме pip. Действительно ли это исключает не установленные в других пунктах модули в другой системе, как того требует вопрос?
JLH
Обратите внимание, что это немного отличается отpip freeze
sg
1
pip list --userпоказывает только пакеты, установленные пользователем, и исключает общесистемные пакеты.
Джейкоб Хьюм
138

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

pip show [options] <package>

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

Даниэль Сайкс
источник
24

Если Debian ведет себя как последние версии Ubuntu относительно pip installцели по умолчанию, это очень просто: он устанавливается /usr/local/lib/вместо /usr/lib( aptцель по умолчанию). Проверьте /ubuntu/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как Арча пак Kage человек Ager проверяет владение файла. No packageявляется частью возвращения он дает , когда пакет не является владельцем файла: error: No package owns $FILENAME. Хитрый обходной путь: я спрашиваю об этом, __init__.pyпотому pacman -Qoчто немного невежественен, когда дело доходит до каталогов :(

Для того, чтобы сделать это для других дистрибутивов, вы должны выяснить, куда pipустанавливать вещи (просто sudo pip installчто-то), как запросить право собственности на файл (метод Debian / Ubuntu dpkg -S) и что возвращает «ни один пакет не владеет этим путем» (Debian / Убунту есть 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'
Capi Etheriel
источник
2
+1 Большое спасибо за вкладыш Arch, это именно то, что я искал. Кстати, любопытный факт: моя установка Arch локализована на итальянском языке, но grep правильно «натолкнул» строки, в которых говорилось «Nessun pacchetto» (по-итальянски «No package»), хотя я указывал «No package». Как так?
Надир Сампаоли
1
@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/"
Дэвид Бохо
1
Привет, я по ошибке проголосовал за это и только что понял это, и теперь мой голос заблокирован. Может ли кто-нибудь проголосовать за это, чтобы нейтрализовать мое отрицательное голосование? Спасибо
Джонатан
22

Начните с:

$ pip list

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

$ pip show <package-name>

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

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

Пример:

$ 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: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    
NG10
источник
Лучший ответ ИМХО. Действительно просто и быстро, если я знаю название пакета. Список пипсов даже не нужен, и заморозка может занять много времени, и мне нужно отфильтровать вещи, которые меня не волнуют. Просто: pip show my_packge
ChuckZ
8

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
yegle
источник
2
Это больше не будет работать. См. Github.com/pypa/pip/issues/5243 Вместо этого вы должны использовать: import pkg_resources [print (d.project_name) для d в pkg_resources.working_set]
Almenon
6

Ниже немного медленно, но он дает хорошо отформатированный список пакетов, о 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)
$
MarkHu
источник
Почему бы не подать билет самостоятельно?
13
1
Очевидно, что следующая версия pip будет иметь новую команду списка: pip-installer.org/en/latest/usage.html#pip-list
MarkHu
5

Добавляя к ответу Пола Вулка,

pip freeze > requirements.txt

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

pip install -r requirements.txt

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

Все это Ваити
источник
5

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

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

MJB
источник
1
Оказывается, у нас было pip freeze --local8 лет. pip list --localтоже доступно ... но обратите внимание, что вопрос OP не о виртуальных средах (которые --localподдерживают), а о различении пакетов дистрибутивов от sudo pip installпакетов.
Capi Etheriel
4

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

ntk4
источник
pip для python2.7, pip3 для python3.x
mjp
3

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

mscheker
источник
2

Вот одна строка для 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:'
eddygeek
источник
1

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

Игнасио Васкес-Абрамс
источник
1

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

user3013438
источник
1

Если вы используете дистрибутив 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чтобы избежать необходимости удалять подтверждение.

CS
источник
1

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

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
Эд К
источник
0

По крайней мере, для 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
нажатие клавиши
источник