Який найпростіший спосіб видалити всі пакунки, встановлені через pip?


614

Я намагаюся виправити один із своїх віртуалів - я хотів би скинути всі встановлені бібліотеки назад до тих, які відповідають виробництву.

Чи є швидкий і простий спосіб зробити це за допомогою піп?


10
@patelshahrukh видалення python НЕ видаляє пакети pip. будь ласка, ЗАСТОСУЙТЕ це, оскільки обидва, швидше за все, НЕ будуть працювати так, як ви думаєте, і , залежно від того, як ви знову встановите python, можете залишити вашу машину в нестабільному стані, що потребує більшої роботи .
— blueberryfields

це може допомогти для пакетів, встановлених в режимі розробки або в редагованому режимі: stackoverflow.com/questions/17346619/…
— Чарлі Паркер

Відповіді:


923

Я знайшов цей фрагмент як альтернативне рішення. Це більш витончене видалення бібліотек, ніж перероблення virtualenv:

pip freeze | xargs pip uninstall -y

Якщо у вас встановлені пакети через VCS, вам потрібно виключити ці рядки та видалити пакунки вручну (підняті з коментарів нижче):

pip freeze | grep -v "^-e" | xargs pip uninstall -y

4
Я вважаю це гарним рішенням, якраз тому, що воно не видаляє віртуальне середовище повністю - я, можливо, вніс зміни, наприклад, postactivateякі залишаться.
— niceguydave

5
Після цього я зрозумів, що видалив setuptoolsпакунок. Я вирішив проблему, дотримуючись тут інструкцій: stackoverflow.com/questions/7446187/…
— День

1
@ gerty3000 так, це (як задається питання) видалить усі пакунки, встановлені у virtual-env. у вашому оточенні, можливо, налаштовувачі краще замість цього встановити у глобальному місці?
— blueberryfields

7
Ви також pip freeze --exclude-editable | xargs pip uninstall -yможете ігнорувати пакунки VCS без використання греп-шаблону
— Коннор Брінтон,

2
А про видалення редагованих пакетів дивіться stackoverflow.com/questions/17346619
— Dan Oak

318

Це буде працювати для всіх систем Mac, Windows та Linux. Щоб отримати список усіх пакетів файлів у файлі вимог.txt (Примітка. Це перезапише вимоги.txt, якщо існують ще, створить новий, також якщо ви не хочете замінювати старі вимоги.txt, тоді вкажіть інше ім'я файлу у всіх наступних командах на місці вимог.txt).

pip freeze > requirements.txt

Тепер видалити по черзі

pip uninstall -r requirements.txt

Якщо ми хочемо видалити все відразу

pip uninstall -r requirements.txt -y

Якщо ви працюєте над існуючим проектом, у якому є requirements.txtфайл, і ваше оточення розходилося, просто замініть requirements.txtнаведені вище приклади на toberemoved.txt. Потім, пройшовши вищезазначені дії, ви можете скористатись requirements.txtдля оновлення чистого середовища.

І для єдиної команди без створення жодного файлу (Як @joeb запропонував).

pip uninstall -y -r <(pip freeze)

11
напевно, варто згадати, що ви примусово перезаписуєте їх файл вимог.txt, якщо вони не знали. :)
— Дейв Григорій

4
Крім того, якщо хтось хоче видалити всі пакунки, додавання "-y" зробить це. Приклад:pip uninstall -r requirements.txt -y
— Девід Меткалф

58
Ви можете використовувати pip uninstall -y -r <(pip freeze)все за один раз.
— Joeb

1
@joeb так, ми також можемо зробити так.
— Харшад Каватія

1
@HarshadKavathiya ви можете використовувати інший файл для збереження заморозки pip, як-от "current.txt", тому
— вимоги.txt

118

Це працює з останніми. Я думаю, що це найкоротший і декларативний спосіб зробити це.

virtualenv --clear MYENV

Але зазвичай я просто видаляю і відтворюю virtualenv, оскільки правила незмінність!


7
Це ефективно те саме, що бігати wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
— Тейлор Едмістон

Насправді - здається (з того, що я щойно зіткнувся), тоді wipeenvяк, перебуваючи в середовищі, видає помилку і нічого не видаляє, якщо використовується в контексті побудови pip install -eрозробки, спроба використання virtualenv --clear MYENVне видає помилки і не видаляє жодну з пакети, які ви, можливо, встановили раніше в середовищі. Принаймні, так це стосується OSX. Див. Bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… для отримання додаткової інформації.
— mpacer

2
wipeenvПсевдонім, наданий virtualenvwrapper, тому не у всіх є його.
— Джонатан Хартлі

2
ну, це якась брудна хитрість, але працює як магія. Я вважаю за краще, щоб всі користувачі використовували pip uninstall -r вимоги.txt -y. Це робить велике очищення.
— Muema

84

Цю відповідь я хотів підняти з розділу коментарів, оскільки це одне з найелегантніших рішень у темі. Повна заслуга за цю відповідь належить @joeb .

pip uninstall -y -r <(pip freeze)

Для мене це чудово спрацювало у випадку використання для очищення папки моїх пакунків користувачів поза контекстом virtualenv, на який багато з вищезазначених відповідей не справляються.

Редагувати: Хтось знає, як змусити цю команду працювати в Makefile?

Бонус: псевдонім баш

Я додаю це до мого профілю bash для зручності:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Потім запустіть:

pipuninstallall

Альтернатива для pipenv

Якщо ви випадково використовуєте pipenv, ви можете просто запустити:

pipenv uninstall --all

8
Якщо бути легко # 1
— Mark

Мені це подобається, але він не працює в нульовому випадку ( pip freezeрезультатом нічого не виходить, якщо не встановлені пакети, а потім pip uninstall, на жаль, скаржиться).
— Ерік Г

Хм гарний улов. Можливо, це може бути перетворено на функцію bash, яка перевіряє, чи не є порожній вихід заморожування pip. Я не бачу чудового способу досягти цього, зберігаючи команду хорошого короткого однолінійного.
— Тейлор Едмістон

1
make <(...)use sh за замовчуванням, але синтаксис заміщення - це башізм. Таким чином, ви можете або використовувати bash -c "...", або обійтися, виконавшиpip freeze | pip uninstall -r /dev/stdin
— Цезар

Не працює з ноутбуками Azure:ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
— SeaDude

54

Інші відповіді, які використовують pip listабо pip freeze повинні включати--local інше, також видалять пакунки, що знаходяться у загальних просторах імен.

Тож ось фрагмент, який я регулярно використовую

 pip freeze --local | xargs pip uninstall -y

Довідка: pip freeze --help


Гарна відповідь ... працював у мене
— igorkf

Це працювало до тих пір, поки не потрапив в пакет , який справив цю помилку: ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.. Тоді я не міг видалити більше модулів.
— SeaDude

39

Спосіб 1 (з pip freeze)

pip freeze | xargs pip uninstall -y

Спосіб 2 (з pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Спосіб 3 (з virtualenv)

virtualenv --clear MYENV

2
Судо не є необхідним і, ймовірно, небезпечно використовувати без ретельного розгляду, оскільки це впливає на глобальну настройку машини. див. відповідь, наприклад: stackoverflow.com/questions/15028648/…
— blueberryfields

6
Спосіб 2 ( pip list) працює чудово, поки у вас випадково не видалить файл -_-
— Джастін

20

Мені це вдалося, зробивши наступне:

Створіть файл вимог під назвою reqs.txt зі списком встановлених пакетів

pip freeze > reqs.txt

потім видаліть усі пакунки з reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Мені подобається цей метод, оскільки у вас завжди є файл вимог до піп-файлу, якщо ви помилитесь. Це також повторюється.


Просто і елегантно, працює як шарм
— Satyaaditya

19

Найшвидший спосіб - переробити virtualenv повністю. Я припускаю, що у вас є файл вимоги.txt, який відповідає виробництву, якщо ні:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt

2
Чи це навіть обробляє той випадок, коли була встановлена ​​редагована установка (в основному це встановлено у програмі setuptools), яка створила локальний файл .egg-info, який потім перешкоджав решті процесу встановлення / видалення? Оскільки це набір файлів, схоже, він не знає, як обробити їх присутність, а замість того, щоб вилучати що-небудь, це робить структуру локального каталогу під MYENV у комплекті з: `> Новими виконуваними файлами python у MYENV / bin / python3.4> Також створення виконуваного файлу в MYENV / bin / python> Встановлення setuptools, pip, wheel ... зроблено. "Але MYENV не скидає середовище!
— mpacer

16

У Windows, якщо ваш pathналаштований правильно, ви можете використовувати:

pip freeze > unins && pip uninstall -y -r unins && del unins

Це має бути подібний випадок для Unix-подібних систем:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Просто попередження, що це не зовсім надійно, оскільки ви можете зіткнутися з такими проблемами, як "Файл не знайдено", але він може працювати в деяких випадках.

EDIT: Для наочності: uninsце довільний файл, у якому записані дані, коли ця команда виконує:pip freeze > unins

Цей файл, який він написав у свою чергу, потім використовується для видалення згаданих вище пакетів з маючи на увазі згоду / попереднє схвалення через pip uninstall -y -r unins

Файл остаточно видаляється після завершення.


14

Використання функції virtualenvwrapper :

wipeenv

Дивіться документацію на wipeenv


6
Якщо ви використовуєте virtualenvwrapper, введітьwipeenv
— raratiru

@raratiru, чудово, зараз мої колеги, напевно, задаються питанням, чому я просто плював каву по всій клавіатурі
— Брайан Джозеф

@BrianJoseph Чорт! Я впав з крісла ... дякую!
— raratiru

14

Спочатку додайте весь пакет до requirements.txt

pip freeze > requirements.txt

Потім видаліть усі

pip uninstall -y -r requirements.txt 

9

Я знаю, що це старе питання, але я натрапив на нього, тому для подальшого використання ви можете це зробити:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, - необхідний файл

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

з документації по протоколу версії 8.1


8

Для користувачів Windows це те, що я використовую в Windows PowerShell

 pip uninstall -y (pip freeze)

6

(додавши це як відповідь, оскільки мені не вистачає репутації, щоб коментувати відповідь @blueberryfields)

Відповідь @blueberryfields працює добре, але не вдається, якщо немає пакету для видалення (що може бути проблемою, якщо це "видалення всіх" є частиною сценарію або makefile). Це можна вирішити xargs -rпри використанні версії GNU xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

від man xargs:

-r, --no-run-if-empty

Якщо стандартний вхід не містить жодних пробілів, не виконуйте команду. Зазвичай команда виконується один раз, навіть якщо немає вводу. Цей параметр є розширенням GNU.


6
pip3 freeze --local | xargs pip3 uninstall -y

Випадок може полягати в тому, що вам потрібно виконати цю команду кілька разів, щоб видалити порожню pip3 freeze --local.


3

Це був найпростіший спосіб для мене видалення всіх пакетів python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))

2

Підтримка крос-платформ, використовуючи лише pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.

2

Це команда, яка працює для мене:

pip list | awk '{print $1}' | xargs pip uninstall -y

2

простий надійний крос-платформний і робочий процес у pipenv також:

pip freeze 
pip uninstall -r requirement

від pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

але не буде оновлено piplock чи pipfile, тому будьте в курсі


1

Якщо ви працюєте virtualenv:

virtualenv --clear </path/to/your/virtualenv>

наприклад, якщо ваш virtualenv є /Users/you/.virtualenvs/projectx, то ви запускаєте:

virtualenv --clear /Users/you/.virtualenvs/projectx

якщо ви не знаєте, де знаходиться ваша віртуальна антура, ви можете бігти which pythonз активованої віртуальної env, щоб отримати шлях


1

У моєму випадку я випадково встановив декілька пакунків у всьому світі за допомогою програми Homebrew, встановленої pipна macOS. Найпростішим способом повернутися до пакетів за замовчуванням був простий:

$ brew reinstall python

Або якщо ви використовували pip3:

$ brew reinstall python3

Ця відповідь передбачає занадто багато про навколишнє середовище і не вирішує безпосередньо проблему, якщо ви, наприклад, використовуєте pyenv.
— Марк

@Mark Звичайно, якщо ви використовуєте pyenv, тоді вам потрібно буде зробити щось інше. У звичайному випадку, коли ви цього не зробите, я вважаю, що це найпростіше і найменш хакізне рішення. Зауважте, що ця умова прямо вказана на початку відповіді.
— Радон Росборо

ОП запитала про віртуаленти. Він не згадував про використання Mac або brew для встановлення Python. Тому ви не можете припустити, що ОС або варилася вара - і ця відповідь не вирішить ВСІ умови. Якщо ви зосередитесь на вирішенні для оточення, використовуючи такий інструмент, як pip - ви звернетесь до контексту середовища, в якому ви перебуваєте. Сподіваюся, що це має сенс.
— Марк

1
@ Марк Я розумію вашу позицію. Ми можемо погодитися не погодитися. Я просто хочу допомогти людям з Google, які натискають на посилання з написом "Який найпростіший спосіб видалити всі пакунки, встановлені через pip?" коли вони дійсно хочуть видалити всі пакети, встановлені в усьому світі за допомогою піп.
— Радон Росборо

За погодженням з @RadonRosborough, назва посилання є репрезентативною, чому я приземлився сюди, навіть якщо ОП насправді не задає те саме питання.
— Кенн Себеста

1

У командній оболонці Windows команда pip freeze | xargs pip uninstall -yне працюватиме. Тому для тих, хто використовує Windows, я придумав альтернативний спосіб зробити це.

  1. Скопіюйте всі назви встановлених пакетів pip з pip freezeкоманди у файл .txt .
  2. Потім перейдіть до місця .txt- файлу та запустіть командуpip uninstall -r *textfile.txt*


1

Я використовую опцію --user для видалення всіх пакунків, встановлених на сайті користувача.

pip3 freeze --користувач | xargs pip3 видалити -y


Я вважаю , що ця відповідь не додає багато нової інформації, я вважав за краще б запропонував удосконалення іншого вже існуючий подібна відповідь , такі як це: stackoverflow.com/a/45475070/11138259
— sinoroc

-1

Pip не може знати, які пакунки були встановлені нею та які пакунки були встановлені менеджером пакунків вашої системи. Для цього вам потрібно було б зробити щось подібне

для дистрибутивів на основі rpm (замініть python2.7 версією python, з якою ви встановили pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

для розподілу на основі деб:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

потім очистити порожні каталоги, що залишилися:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Я визнав верхню відповідь дуже оманливою, оскільки вона видалить усі (більшість?) Пакетів python з вашого розповсюдження і, ймовірно, залишить вас зі зламаною системою.


При всій повазі це здається порівнянним. Чому б ні dpkg-query -S '/usr/lib/python2.7/*', витягнути імена та dpkg-query -Lкожне ім’я, щоб скинути пов'язані файли? У ньому вже підготовлені маніфести. Моє основне заперечення полягає в тому, що замість націлювання пакетів, встановлених де завгодно, окрім Pip, ви орієнтували пакунки, встановлені чим-небудь, крім менеджера, якого ви очікуєте, і в такому місці, яке піп, як правило, не повинно торкатися. pip list -lперелічує пакунки, встановлені локально, а деякі навіть pip install --target=.... Видалення всіх поточних порожніх дріусів теж вкусить вас!
— Іван П
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.