Есть ли способ найти все пакеты Python PyPI, которые были установлены с помощью easy_install или pip? Я имею в виду, исключая все, что было / установлено с помощью инструментов распространения (в данном случае apt-get на Debian).
Есть ли способ найти все пакеты Python PyPI, которые были установлены с помощью easy_install или pip? Я имею в виду, исключая все, что было / установлено с помощью инструментов распространения (в данном случае apt-get на Debian).
Ответы:
pip freeze
выведет список установленных пакетов и их версий. Он также позволяет записывать эти пакеты в файл, который впоследствии можно будет использовать для настройки новой среды.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
и pip list
перечислить все. Они не исключают пакеты, которые не были установлены pip
.
pip freeze
надежным в сценариях, в то время как pip list
генерирует неожиданные ошибки при использовании с каналами.
pip list -l
или pip list --local
лучший ответ, см stackoverflow.com/a/43012269/491884 по @MJB
Начиная с версии 1.3, вы можете использовать pip list
Он имеет несколько полезных опций, в том числе возможность показывать устаревшие пакеты. Вот документация: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
показывает только пакеты, установленные пользователем, и исключает общесистемные пакеты.
Если кому-то интересно, вы можете использовать команду «pip show».
pip show [options] <package>
Это перечислит каталог установки данного пакета.
Если 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'
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/"
Начните с:
$ 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
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
которых известно. То есть не все из них были установлены «по» 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)
$
Добавляя к ответу Пола Вулка,
pip freeze > requirements.txt
создаст файл требований со всеми установленными пакетами вместе с установленными номерами версий в активной среде в текущем местоположении. Бег
pip install -r requirements.txt
установит пакеты, указанные в файле требований.
Более новые версии 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
пакетов.
Обратите внимание: если на вашем компьютере установлено несколько версий 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])
Я на 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
чтобы избежать необходимости удалять подтверждение.
Список пипсов [опции] Вы можете увидеть полную ссылку здесь
По крайней мере, для 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