Який найпростіший спосіб видалити всі пакунки, встановлені через 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.