Какой самый простой способ удалить все пакеты, установленные с помощью pip?

616

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

Есть ли быстрый и простой способ сделать это с помощью pip?

blueberryfields
источник
10
@patelshahrukh Удаление Python НЕ удаляет пакеты pip. пожалуйста ИЗБЕЖАТЬ делать это, так как оно , как , скорее всего , не будет работать так , как вы думаете , это будет, и , в зависимости от того, как вы установите питон снова, может оставить свою машину в неустойчивом состоянии , что это больше работы , чтобы исправить .
черничные
это может помочь для пакетов, установленных в режиме разработки или в редактируемом режиме: stackoverflow.com/questions/17346619/…
Чарли Паркер

Ответы:

927

Я нашел этот фрагмент в качестве альтернативного решения. Это более изящное удаление библиотек, чем переделка virtualenv:

pip freeze | xargs pip uninstall -y

Если у вас есть пакеты, установленные через VCS, вам нужно исключить эти строки и удалить пакеты вручную (повышено из комментариев ниже):

pip freeze | grep -v "^-e" | xargs pip uninstall -y
blueberryfields
источник
4
Я считаю это хорошим решением, просто потому, что оно не удаляет виртуальную среду полностью - возможно, я внес изменения, например, postactivateкоторые останутся.
niceguydave
5
После запуска этого я понял, что это удалило setuptoolsпакет. Я решил эту проблему, выполнив следующие инструкции: stackoverflow.com/questions/7446187/…
Дан
1
@ gerty3000 да, это (как задает вопрос) удалит все пакеты, установленные в виртуальной среде. в вашей среде может быть лучше установить setuptools в глобальном местоположении?
черничные
7
Вы также можете использовать, pip freeze --exclude-editable | xargs pip uninstall -yчтобы игнорировать пакеты VCS без использования шаблона grep
Коннор Бринтон,
2
А чтобы удалить редактируемые пакеты, смотрите stackoverflow.com/questions/17346619
Дэн Оук
319

Это будет работать для всех систем Mac, Windows и Linux. Чтобы получить список всех пакетов pip в файле needs.txt (Примечание: это перезапишет файл require.txt, если существует, иначе создаст новый, также, если вы не хотите заменять старый файл require.txt, укажите другое имя файла). во всех следующих командах вместо place.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
Вероятно, стоит упомянуть, что вы принудительно перезаписываете их файл require.txt, если они этого не знали. :)
Дейв Грегори
4
Кроме того, если вы хотите удалить все пакеты, добавьте «-y». Пример:pip uninstall -r requirements.txt -y
Дэвид Меткалф
58
Вы можете использовать, pip uninstall -y -r <(pip freeze)чтобы сделать все за один раз.
Иоав
1
@joeb да, мы можем сделать то же самое.
Харшад Каватия
1
@HarshadKavathiya вы можете использовать другой файл для хранения замораживания в пипсах, например «current.txt», так что
require.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 needs.txt -y. Это делает большую уборку.
Muema
84

Я хотел поднять этот ответ в разделе комментариев, потому что это одно из самых элегантных решений в этой ветке. Полная оценка этого ответа идет на @joeb .

pip uninstall -y -r <(pip freeze)

Это прекрасно сработало для случая использования очистки папки пользовательских пакетов вне контекста virtualenv, который не обрабатываются многими из приведенных выше ответов.

Редактировать: Кто-нибудь знает, как заставить эту команду работать в Makefile?

Бонус: псевдоним Bash

Я добавляю это в свой профиль bash для удобства:

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

Затем запустите:

pipuninstallall

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

Если вы используете pipenv, вы можете просто запустить:

pipenv uninstall --all
Тейлор Эдмистон
источник
8
Должно быть легко № 1
Марк
Мне это нравится, но в нулевом случае это не работает ( pip freezeничего не выводится, если не установлено ни одного пакета, а затем pip uninstall, к сожалению, выдает жалобы).
Эрик Г
Хм хороший улов. Возможно, его можно включить в функцию bash, которая проверяет, является ли вывод замораживания пипса не пустым. Я не вижу отличного способа добиться этого, сохраняя при этом команду хорошей короткой строчкой.
Тейлор Эдмистон
1
make использует sh по умолчанию, но синтаксис подстановки <(...)- это bashism. Таким образом, вы можете либо использовать 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

Ref: pip freeze --help

nehem
источник
Хороший ответ ... работал для меня
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
Suriyaa
источник
2
Использование sudo не является необходимым и, вероятно, опасно для использования без тщательного рассмотрения, поскольку оно влияет на глобальную настройку машины. см. этот ответ, например: stackoverflow.com/questions/15028648/…
blueberryfields
6
Метод 2 ( pip list) прекрасно работает, пока вы случайно не удалите pip -_-
Джастин
20

Мне удалось это сделать следующим образом:

Создайте файл требований с именем reqs.txt со списком установленных пакетов

pip freeze > reqs.txt

затем удалите все пакеты из reqs.txt

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

Мне нравится этот метод, так как у вас всегда есть файл требований к пунктам, к которому можно обратиться в случае ошибки. Это также повторяется.

Prime By Design
источник
Простой и элегантный, работает как шарм
Satyaaditya
19

Самый быстрый способ - полностью переделать virtualenv. Я предполагаю, что у вас есть файл require.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

Просто предупреждение, что это не совсем верно, так как вы можете столкнуться с такими проблемами, как «Файл не найден», но, тем не менее, это может сработать в некоторых случаях.

РЕДАКТИРОВАТЬ: Для ясности: uninsэто произвольный файл, в который записаны данные при выполнении этой команды:pip freeze > unins

Этот файл, который он написал поочередно, затем используется для удаления вышеупомянутых пакетов с подразумеваемым согласием / предварительным одобрением посредством pip uninstall -y -r unins

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

Ричард Кеннет Нискиор
источник
14

Использование функции virtualenvwrapper :

wipeenv

Смотрите документацию wipeenv

zesk
источник
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, --requirement файл

Удалите все пакеты, указанные в данном файле требований. Эта опция может быть использована несколько раз.

из документации пипа версия 8.1

Craicerjack
источник
8

Для пользователей Windows это то, что я использую в Windows PowerShell

 pip uninstall -y (pip freeze)
benwrk
источник
6

(добавив это как ответ, потому что у меня недостаточно репутации, чтобы комментировать ответ @blueberryfields)

Ответ @blueberryfields работает хорошо, но терпит неудачу, если нет пакета для удаления (что может быть проблемой, если это «удалить все» является частью сценария или make-файла). Это может быть решено 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.

obotezat
источник
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))
Аноним 138
источник
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

если вы не знаете, где находится ваш виртуальный env, вы можете запустить его which pythonиз активированного виртуального env, чтобы получить путь

punkrockpolly
источник
1

В моем случае я случайно установил несколько пакетов по всему миру, используя Homebrew-установленный pipна macOS. Самый простой способ вернуться к пакетам по умолчанию был простой:

$ brew reinstall python

Или, если вы использовали pip3:

$ brew reinstall python3
Радон Росборо
источник
Этот ответ предполагает слишком много об окружающей среде и не решает проблему напрямую, например, если вы используете pyenv.
Марк
@ Марк Хорошо, если вы используете pyenv, то вам нужно сделать что-то другое. В общем случае, если это не так, я считаю, что это самое простое и наименее хакерское решение. Обратите внимание, что это условие явно указано в начале ответа.
Радон Росборо
ОП спросил о virtualenvs. Он не упомянул об использовании Mac или brew для установки Python. Поэтому вы не можете предполагать, что использовалась ОС или brew - и этот ответ не решит ВСЕ условия. Если вы сосредоточены на решении для окружающей среды с помощью такого инструмента, как pip - вы будете обращаться к контексту среды, в которой находитесь. Надеюсь, что это имеет смысл.
Марк
1
@ Марк, я понимаю твою позицию. Мы можем не соглашаться. Я просто хочу помочь людям из Google, которые нажимают на ссылку с надписью «Какой самый простой способ удалить все пакеты, установленные с помощью pip?» когда они действительно хотят удалить все пакеты, установленные глобально, с помощью pip.
Радон Росборо
Согласившись с @RadonRosborough, заголовок ссылки показывает, почему я попал сюда, даже если ОП на самом деле не задает тот же вопрос.
Кенн Себеста
1

В командной оболочке Windows команда pip freeze | xargs pip uninstall -yне будет работать. Поэтому для тех, кто использует Windows, я нашел альтернативный способ сделать это.

  1. Скопируйте все имена установленных пакетов pip из pip freezeкоманды в текстовый файл.
  2. Затем перейдите в местоположение вашего файла .txt и выполните командуpip uninstall -r *textfile.txt*
Сушант Чаудхари
источник
1

Если вы используете pew, вы можете использовать команду wipeenv :

pew wipeenv [env]

Мухаммед Банисейд
источник
1

Я использую опцию --user для удаления всех пакетов, установленных на сайте пользователя.

pip3 freeze --user | 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

для основанного на deb распространения:

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. pip list -lперечисляет пакеты, которые он установил локально, а некоторые даже pip install --target=.... Удаление всех в настоящее время пустых папок тоже укусит вас!
Джон Р