Есть ли способ найти все пакеты Python PyPI, которые были установлены с помощью easy_install или pip? Я имею в виду, исключая все, что было / установлено с помощью инструментов дистрибутива (в данном случае apt-get в Debian).
Найти все пакеты, установленные с помощью easy_install / pip?
Ответы (18)
pip freeze
выведет список установленных пакетов и их версий. Это также позволяет вам записывать эти пакеты в файл, который позже можно использовать для настройки новой среды.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
и pip list
перечисляют все. Они не исключают пакеты, которые не были установлены pip
.
- person Eliad; 15.12.2016
pip freeze
надежен в сценариях, тогда как pip list
будет генерировать неожиданные ошибки при использовании с каналами.
- person Dale Anderson; 18.01.2017
pip list -l
или pip list --local
- лучший ответ, см. stackoverflow.com/a/43012269/491884 от @MJB
- person jmuc; 02.05.2017
Начиная с версии 1.3 pip теперь вы можете использовать pip list
В нем есть несколько полезных опций, включая возможность отображать устаревшие пакеты. Вот документация: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
- person s g; 28.07.2017
pip list --user
показывает только пакеты, установленные пользователем, и исключает общесистемные пакеты.
- person Jacob Hume; 06.03.2020
Если кому-то интересно, вы можете использовать команду pip show.
pip show [options] <package>
Это отобразит каталог установки данного пакета.
Начнем с:
$ 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
Если 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'
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
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
Более новые версии pip имеют возможность делать то, что хочет OP, через pip list -l
или pip freeze -l
(--list
).
В Debian (по крайней мере) на странице руководства это не проясняется, и я только обнаружил это - в предположении, что функция должна существовать - с pip list --help
.
Есть недавние комментарии, которые предполагают, что эта функция не очевидна ни в документации, ни в существующих ответах (хотя некоторые намекают на это), поэтому я подумал, что должен опубликовать. Я бы предпочел сделать это в качестве комментария, но у меня нет очков репутации.
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)
$
Добавляя к ответу @Paul Woolcock,
pip freeze > requirements.txt
создаст файл требований со всеми установленными пакетами вместе с номерами версий, установленных в активной среде в текущем расположении. Бег
pip install -r requirements.txt
установит пакеты, указанные в файле требований.
Обратите внимание: если на вашем компьютере установлено несколько версий 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
.
Как отметил @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
Вот однострочный вариант для 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:'
Получите все имена файлов / папок в site-packages/
(и dist-packages/
, если он существует) и с помощью диспетчера пакетов удалите те, которые были установлены через пакет.
pip freeze перечисляет все установленные пакеты, даже если не pip / easy_install. В CentOs / Redhat найден пакет, установленный через rpm.
Если вы используете дистрибутив 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
, чтобы избежать необходимости подтверждать удаление.
Для тех, у кого не установлен pip, я нашел этот быстрый скрипт на github (работает с Python 2.7.13):
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
pip list [options] Вы можете увидеть полную справку здесь
По крайней мере, для 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