Я пытаюсь исправить одну из моих virtualenvs - я хотел бы сбросить все установленные библиотеки обратно на те, которые соответствуют производству.
Есть ли быстрый и простой способ сделать это с помощью pip?
Я пытаюсь исправить одну из моих virtualenvs - я хотел бы сбросить все установленные библиотеки обратно на те, которые соответствуют производству.
Есть ли быстрый и простой способ сделать это с помощью pip?
Ответы:
Я нашел этот фрагмент в качестве альтернативного решения. Это более изящное удаление библиотек, чем переделка virtualenv:
pip freeze | xargs pip uninstall -y
Если у вас есть пакеты, установленные через VCS, вам нужно исключить эти строки и удалить пакеты вручную (повышено из комментариев ниже):
pip freeze | grep -v "^-e" | xargs pip uninstall -y
postactivate
которые останутся.
setuptools
пакет. Я решил эту проблему, выполнив следующие инструкции: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
чтобы игнорировать пакеты VCS без использования шаблона grep
Это будет работать для всех систем 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)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
чтобы сделать все за один раз.
Это работает с последними. Я думаю, что это самый короткий и самый декларативный способ сделать это.
virtualenv --clear MYENV
Но обычно я просто удаляю и воссоздаю virtualenv, поскольку правила неизменяемости!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
как в то время как внутри среды выдает ошибку и ничего не удаляет, если она используется в контексте pip install -e
сборки разработки, попытка использования virtualenv --clear MYENV
не выдает ошибку и не удаляет ничего из пакеты, которые вы, возможно, установили ранее в среде. По крайней мере, это относится к OSX. См. Bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… для получения дополнительной информации.
wipeenv
это псевдоним, предоставляемый virtualenvwrapper, так что не у всех есть.
Я хотел поднять этот ответ в разделе комментариев, потому что это одно из самых элегантных решений в этой ветке. Полная оценка этого ответа идет на @joeb .
pip uninstall -y -r <(pip freeze)
Это прекрасно сработало для случая использования очистки папки пользовательских пакетов вне контекста virtualenv, который не обрабатываются многими из приведенных выше ответов.
Редактировать: Кто-нибудь знает, как заставить эту команду работать в Makefile?
Я добавляю это в свой профиль bash для удобства:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Затем запустите:
pipuninstallall
Если вы используете pipenv, вы можете просто запустить:
pipenv uninstall --all
pip freeze
ничего не выводится, если не установлено ни одного пакета, а затем pip uninstall
, к сожалению, выдает жалобы).
<(...)
- это bashism. Таким образом, вы можете либо использовать bash -c "...", либо обойти, выполнивpip freeze | pip uninstall -r /dev/stdin
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.
Другие ответы, которые используют pip list
или pip freeze
должны включать,--local
иначе будут также удалять пакеты, которые находятся в общих пространствах имен.
Так вот фрагмент, который я регулярно использую
pip freeze --local | xargs pip uninstall -y
Ref: pip freeze --help
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.
. Тогда я не мог удалить больше модулей.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
) прекрасно работает, пока вы случайно не удалите pip -_-
Мне удалось это сделать следующим образом:
Создайте файл требований с именем reqs.txt со списком установленных пакетов
pip freeze > reqs.txt
затем удалите все пакеты из reqs.txt
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
Мне нравится этот метод, так как у вас всегда есть файл требований к пунктам, к которому можно обратиться в случае ошибки. Это также повторяется.
Самый быстрый способ - полностью переделать virtualenv. Я предполагаю, что у вас есть файл require.txt, который соответствует производству, если нет:
# On production:
pip freeze > reqs.txt
# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
В 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
Файл окончательно удаляется после завершения.
Это старый вопрос, который я знаю, но я наткнулся на него, поэтому для дальнейшего использования вы можете сделать это:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r, --requirement файл
Удалите все пакеты, указанные в данном файле требований. Эта опция может быть использована несколько раз.
из документации пипа версия 8.1
(добавив это как ответ, потому что у меня недостаточно репутации, чтобы комментировать ответ @blueberryfields)
Ответ @blueberryfields работает хорошо, но терпит неудачу, если нет пакета для удаления (что может быть проблемой, если это «удалить все» является частью сценария или make-файла). Это может быть решено xargs -r
при использовании версии GNU xargs
:
pip freeze --exclude-editable | xargs -r pip uninstall -y
от man xargs
:
-r, --no-run-if-empty
Если стандартный ввод не содержит небланков, не запускайте команду. Обычно команда запускается один раз, даже если нет ввода. Эта опция является расширением GNU.
Для меня это был самый простой способ удалить все пакеты 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))
Кроссплатформенная поддержка с использованием только 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.
простой и надежный кроссплатформенный способ работы в pipenv:
pip freeze
pip uninstall -r requirement
по pipenv:
pipenv run pip freeze
pipenv run pip uninstall -r requirement
но не будет обновлять piplock или pipfile, так что имейте в виду
Если вы работаете virtualenv
:
virtualenv --clear </path/to/your/virtualenv>
например, если ваш virtualenv /Users/you/.virtualenvs/projectx
, то вы запустите:
virtualenv --clear /Users/you/.virtualenvs/projectx
если вы не знаете, где находится ваш виртуальный env, вы можете запустить его which python
из активированного виртуального env, чтобы получить путь
В моем случае я случайно установил несколько пакетов по всему миру, используя Homebrew-установленный pip
на macOS. Самый простой способ вернуться к пакетам по умолчанию был простой:
$ brew reinstall python
Или, если вы использовали pip3
:
$ brew reinstall python3
В командной оболочке Windows команда
pip freeze | xargs pip uninstall -y
не будет работать. Поэтому для тех, кто использует Windows, я нашел альтернативный способ сделать это.
pip freeze
команды в текстовый файл.pip uninstall -r *textfile.txt*
Если вы используете pew
, вы можете использовать команду wipeenv :
pew wipeenv [env]
Я использую опцию --user для удаления всех пакетов, установленных на сайте пользователя.
pip3 freeze --user | xargs pip3 удалить -y
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=...
. Удаление всех в настоящее время пустых папок тоже укусит вас!