Знайти всі встановлені пакети з 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


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 тепер ви можете використовувати pip list

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


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( apttarget target). Перевірте /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, в який каталог встановлюється файл, який знаходиться в файлі, 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) та що повернення "жоден пакет не має цього шляху" (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'

2
+1 Дякую багато за одноколісний арку, саме це я шукав. До речі, цікавий факт: моє встановлення Arch локалізовано італійською мовою, але grep правильно 'схопив' рядки, на яких написано 'Nessun pacchetto' (італійською мовою 'Без пакета'), хоча я схопився за "Без пакета". Як це?
Надір Сампаоолі

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 та тут для отримання додаткової інформації про список піп.

Приклад:

$ 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 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

2
Це більше не буде працювати. Див. Github.com/pypa/pip/isissue/5243 Натомість слід використовувати: імпортувати pkg_resources [print (d.project_name) для d в pkg_resources.working_set]
Альменон

6

Нижче трохи повільно, але це дає добре відформатований список пакетів, про які pipвідомо. Тобто, не всі вони були встановлені "через" pip, але всі вони повинні мати можливість модернізувати за допомогою pip.

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

Причина, через яку вона повільна, полягає в тому, що в ній перераховано вміст всього репі-репі. Я подав квиток, пропонуючи 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)
$

Чому б не подати квиток самостійно?
lajarre

1
Очевидно, що наступна версія pip матиме нову команду списку: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

Додавши до відповіді @Paul Woolcock,

pip freeze > requirements.txt

створить файл вимог із усіма встановленими пакетами разом із встановленими номерами версій в активному середовищі в поточному місці. Біг

pip install -r requirements.txt

встановить пакунки, зазначені у файлі вимог.


5

Більш новіші версії pip мають можливість робити те, що OP хоче через pip list -lабо pip freeze -l( --list).
На Debian (принаймні) сторінка man не робить цього зрозумілою, і я лише виявив її - за умови, що функція повинна існувати - з pip list --help.

Останні коментарі свідчать про те, що ця функція не очевидна ні в документації, ні в існуючих відповідях (хоча деякі натякають на них), тому я подумав, що слід написати. Я хотів би зробити це як коментар, але у мене немає балів репутації.


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.


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


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:'

1

Отримайте всі назви файлів / папок у site-packages/dist-packages/якщо вони є) та використовуйте менеджер пакунків, щоб зняти ті, які були встановлені через пакет.


1

pip freeze перераховує всі встановлені пакети, навіть якщо не через pip / easy_install. У CentOs / Redhat знайдений пакет, встановлений через rpm.


1

Якщо ви використовуєте розподіл Anaconda python, ви можете скористатися 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уникнення необхідності надати підтвердження для видалення.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.