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