Як видалити пакунок, встановлений за допомогою програми pip install --user


219

Існує --userопція для pip, яка може встановити пакет Python на кожного користувача:

pip install --user [python-package-name]

Я використав цю опцію, щоб встановити пакет на сервер, до якого у мене немає кореневого доступу. Що мені зараз потрібно - це видалити встановлений пакет у поточного користувача. Я спробував виконати цю команду:

pip uninstall --user [python-package-name]

Але я отримав:

no such option: --user

Як я можу видалити пакунок, який я встановив pip install --user, окрім пошуку вручну та видалення пакета?

Я знайшов цю статтю

pip не може видалити з каталогу сайтів-пакунків кожного користувача

де описано, що деінсталяція пакетів з каталогу користувачів не підтримується. Відповідно до статті, якщо вона була реалізована правильно, то з

pip uninstall [package-name]

встановлений пакет також буде шукатись у каталогах користувачів. Але проблема як і раніше залишається для мене. Що робити, якщо один і той же пакет був встановлений як для всієї системи, так і для користувача? Що робити, якщо комусь потрібно націлити конкретний каталог користувачів?


1
Ні, вам потрібно встановити один virtualenv на користувача: групувати та надати належні системні дозволи папці, що містить його.
Даніус

3
Немає можливості встановити пакет для всіх користувачів, а потім вибірково видалити його для деяких користувачів. Якщо пакет був встановлений так, як --userвидалення без --userцього зробить те, що ви хочете.
tripleee

@tripleee: У мене немає системи дозволів, і я не хочу цього, мені просто потрібно видалити її для поточного користувача
Serjik

1
З’ясуйте, у якому каталозі у вас немає дозволів на видалення та виправити його дозволи або вручну перемістити його в бік.
tripleee

Відповіді:


196

Випробувавши це за допомогою Python 3.5 та pip 7.1.2 в Linux, ситуація виглядає так:

  • pip install --user somepackageвстановлюється $HOME/.localта видаляє його, використовуючи його pip uninstall somepackage.

  • Це справедливо, незалежно від того, чи somepackageвстановлюється одночасно загальносистемна система чи ні .

  • Якщо пакет встановлений в обох місцях, буде видалено лише локальний. Щоб видалити пакунок у всій системі за допомогою pip, спочатку видаліть його локально, потім знову запустіть ту саму команду видалення з rootпривілеями.

  • На додаток до заздалегідь визначеного каталогу встановлення користувача, pip install --target somedir somepackageвстановить пакет в somedir. Немає можливості видалити пакунок із такого місця за допомогою pip. (Але Github має дещо старий запит на витягнення, який реалізується pip uninstall --target.)

  • Оскільки єдині місця, pipякі коли-небудь будуть видалятись, є загальносистемними та заздалегідь визначеними локальними користувачами, вам потрібно запустити pip uninstallяк відповідний користувач, щоб видалити його з локального каталогу встановлення користувача.


2
Чи є ці твердження точними для запуску pip всередині віртуального середовища?
kbolino

в моєму випадку видалення не працювало, щоб пакет pip 9.0.1 все ще встановлений на HOME /./ local
Genom,

2
Точка 2, схоже, не відповідає дійсності моєї системи. У мене є пакет системи jediвстановлений в /usr/lib64/python2.7/site-packages/. Коли я це роблю, як звичайний користувач: pip install --user jedi а потім pip uninstall jedi, pip намагається видалити, /usr/lib64/python2.7/site-packages/jediа потім розпочати Permission denied. Отже, якщо --userдля команди видалення не існує, як мені сказати видалити не намагатися видалити, /usr/lib64/python2.7/site-packages/jediале ~/.local/lib64/python3.6/site-packages/jedi?
АстроФлойд

Точно так само, як і @AstroFloyd
Nikana Reklawyks


9

Будьте обережні, але для тих, хто використовує pip install --user some_pkg всередині віртуального середовища .

$ path/to/python -m venv ~/my_py_venv
$ source ~/my_py_venv/bin/activate
(my_py_venv) $ pip install --user some_pkg
(my_py_venv) $ pip uninstall some_pkg
WARNING: Skipping some_pkg as it is not installed.
(my_py_venv) $ pip list
# Even `pip list` will not properly list the `some_pkg` in this case

У цьому випадку вам доведеться деактивувати поточне віртуальне середовище , а потім використовувати відповідні python/ pipвиконувані файли для переліку або видалення пакунків сайту користувача:

(my_py_venv) $ deactivate
$ path/to/python -m pip list
$ path/to/python -m pip uninstall some_pkg

Зауважимо, що про це питання повідомлялося кілька років тому . І здається, що поточний висновок такий: --userнедійсний у віртуальній середовищі pip, оскільки місце розташування користувача насправді не має сенсу для віртуального середовища.


3
Я занадто пізно! Я використовував --userвсередині віртуального env, чи є спосіб це повернути ?, тому pip listщо не працює ....
jnfran92

2
"І, схоже, поточний висновок такий: - користувач не дійсний у вікні віртуального env, оскільки місце розташування користувача насправді не має сенсу для віртуального середовища." Домовились. Користувач встановлює поразку цілі цілі віртуального середовища. На жаль, є маса поганих прикладів того, як люди роблять це там.
Стівен Бош

5

Я думаю, що можна видалити пакунки, встановлені --userпрапором. Цей працював на мене;

pip freeze --user | xargs pip uninstall -y

Для пітона 3;

pip3 freeze --user | xargs pip3 uninstall -y

Але якимось чином ці команди не видаляють setuptools та pip. Після цих команд (якщо ви дійсно хочете чистого пітона) ви можете видалити їх;

pip uninstall setuptools && pip uninstall pip


2
Це елегантне рішення, яке добре працювало для мене.
Стівен Бош

2

Відповідь поки не можлива . Його потрібно видалити вручну.


Під час встановлення пакету було відстежено. Видалення ніколи не працювало після цього.
сіям

Як перерахувати всі файли, встановлені в певному пакеті (щоб я міг їх видалити)?
АстроФлойд

Це фактично неможливо, оскільки pip запускає setup.py, який виконує зовнішній код. Поки setup.py не буде видалено повністю, забудьте про це, ймовірно, до 2022 року це буде.
sorin

2

Як згадував @ thomas-lotze, в даний час інструменти для роботи з піпними системами не роблять цього, оскільки немає відповідного варіанту --user. Але мені здається, що я можу зайти в ~ / .local / bin і шукати конкретний pip #. #, Який мені здається, що він відповідає параметру --user.

У моєму випадку:

antho@noctil: ~/.l/bin$ pwd
/home/antho/.local/bin
antho@noctil: ~/.l/bin$ ls pip*
pip  pip2  pip2.7  pip3  pip3.5

А потім просто видаліть конкретну версію pip.


stackoverflow.com/a/11250821/14420, щоб побачити рецепт видалення ванни, наприклад, ./pip2 freeze | grep -v "^-e" | xargs pip uninstall -yдля всього, крім пакунків, встановлених у режимі редагування
matt wilkie,

0

У мене працює анаконда версії 4.3.22 та середовища python3.6.1, і у мене була ця проблема. Ось історія та виправлення:

pip uninstall opencv-python # -- the original step. failed.

ImportError: DLL load failed: The specified module could not be found.

Я зробив це в моєму середовищі python3.6 і отримав цю помилку.

python -m pip install opencv-python # same package as above.
conda install -c conda-forge opencv # separate install parallel to opencv
pip-install opencv-contrib-python # suggested by another user here. doesn't resolve it.

Далі я спробував завантажити python3.6 і помістити python3.dll в папку і в різні папки. нічого не змінилося.

нарешті, це виправило:

pip uninstall opencv-python

(інша версія conda-forge все ще встановлена) Залишилася лише версія conda, яка працює в 3.6.

>>>import cv2
>>>

працює!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.