Я намагаюся виправити один із своїх віртуалів - я хотів би скинути всі встановлені бібліотеки назад до тих, які відповідають виробництву.
Чи є швидкий і простий спосіб зробити це за допомогою піп?
Я намагаюся виправити один із своїх віртуалів - я хотів би скинути всі встановлені бібліотеки назад до тих, які відповідають виробництву.
Чи є швидкий і простий спосіб зробити це за допомогою піп?
Відповіді:
Я знайшов цей фрагмент як альтернативне рішення. Це більш витончене видалення бібліотек, ніж перероблення 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 без використання греп-шаблону
Це буде працювати для всіх систем 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)
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
, на жаль, скаржиться).
<(...)
use sh за замовчуванням, але синтаксис заміщення - це башізм. Таким чином, ви можете або використовувати 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
Довідка: 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
) працює чудово, поки у вас випадково не видалить файл -_-
Мені це вдалося, зробивши наступне:
Створіть файл вимог під назвою reqs.txt зі списком встановлених пакетів
pip freeze > reqs.txt
потім видаліть усі пакунки з reqs.txt
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
Мені подобається цей метод, оскільки у вас завжди є файл вимог до піп-файлу, якщо ви помилитесь. Це також повторюється.
Найшвидший спосіб - переробити virtualenv повністю. Я припускаю, що у вас є файл вимоги.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
Просто попередження, що це не зовсім надійно, оскільки ви можете зіткнутися з такими проблемами, як "Файл не знайдено", але він може працювати в деяких випадках.
EDIT: Для наочності: unins
це довільний файл, у якому записані дані, коли ця команда виконує:pip freeze > unins
Цей файл, який він написав у свою чергу, потім використовується для видалення згаданих вище пакетів з маючи на увазі згоду / попереднє схвалення через pip uninstall -y -r unins
Файл остаточно видаляється після завершення.
Я знаю, що це старе питання, але я натрапив на нього, тому для подальшого використання ви можете це зробити:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r, - необхідний файл
Видаліть усі пакунки, перелічені в даному файлі вимог. Цей параметр можна використовувати кілька разів.
з документації по протоколу версії 8.1
(додавши це як відповідь, оскільки мені не вистачає репутації, щоб коментувати відповідь @blueberryfields)
Відповідь @blueberryfields працює добре, але не вдається, якщо немає пакету для видалення (що може бути проблемою, якщо це "видалення всіх" є частиною сценарію або makefile). Це можна вирішити 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
якщо ви не знаєте, де знаходиться ваша віртуальна антура, ви можете бігти which python
з активованої віртуальної env, щоб отримати шлях
У моєму випадку я випадково встановив декілька пакунків у всьому світі за допомогою програми Homebrew, встановленої pip
на macOS. Найпростішим способом повернутися до пакетів за замовчуванням був простий:
$ brew reinstall python
Або якщо ви використовували pip3
:
$ brew reinstall python3
У командній оболонці Windows команда
pip freeze | xargs pip uninstall -y
не працюватиме. Тому для тих, хто використовує Windows, я придумав альтернативний спосіб зробити це.
pip freeze
команди у файл .txt .pip uninstall -r *textfile.txt*
Якщо ви використовуєте pew
, ви можете скористатися командою wipeenv :
pew wipeenv [env]
Я використовую опцію --user для видалення всіх пакунків, встановлених на сайті користувача.
pip3 freeze --користувач | 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
для розподілу на основі деб:
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=...
. Видалення всіх поточних порожніх дріусів теж вкусить вас!