Чи є спосіб знайти всі пакети 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 тепер ви можете використовувати 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
target 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'
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 та тут для отримання додаткової інформації про список піп.
Приклад:
$ 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'
Причина, через яку вона повільна, полягає в тому, що в ній перераховано вміст всього репі-репі. Я подав квиток, пропонуючи 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
встановить пакунки, зазначені у файлі вимог.
Більш новіші версії pip мають можливість робити те, що OP хоче через pip list -l
або pip freeze -l
( --list
).
На Debian (принаймні) сторінка man не робить цього зрозумілою, і я лише виявив її - за умови, що функція повинна існувати - з 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.
Якщо ви використовуєте розподіл 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
уникнення необхідності надати підтвердження для видалення.
список піп [параметри] Ви можете ознайомитись із повною довідкою тут
Принаймні для 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