Яка мета “встановити піп - користувач…”?


189

Від pip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

Документація для сайту.USER_BASE - це жахливий червоточина цікавої тематики * NIX, яку я не розумію.

Яка мета --userпростої англійської мови? Чому інталінг пакета має ~/.local/значення? Чому б просто не поставити виконуваний файл десь у моєму $ PATH?


2
Ви можете import site; print site.USER_SITEроздрукувати місце встановлення. Для мене я отримав /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Тревор Бойд Сміт

1
На хост-машині /usr/local/lib/pythonX.X/dist-packages- це каталог за замовчуванням для пакетів, встановлених через pip . Але якщо один користувач хоче встановити специфічні для користувача пакети, він може використовувати $ sudo pip3 --user install some_package. Цей пакет залишатиметься недоступним для груп та інших, хто має доступ до цього хоста.
noobninja

Відповіді:


223

pip за замовчуванням для встановлення пакетів Python в системний каталог (наприклад, /usr/local/lib/python3.4). Для цього потрібен кореневий доступ.

--user замість цього встановлює пакети для встановлення піп у вашому домашньому каталозі, що не вимагає спеціальних привілеїв.


1
Дякую; що має сенс. Але чи є сенс --userпереконатися, що хтось не запускає пакунок як root? (Я уявляю щось подібне, як, наприклад, Wireshark / kismet / burpsuite параметри, щоб налаштувати політику групового доступу, тим самим не дозволяючи всім функціям програми запускатися як корінь. Це на правильному шляху?) Або це --userваріант просто мається на увазі щоб дозволити встановлення без привілеїв root? Якщо це так, то чому я ніколи не використовую sudo pip install foo_package? Я ніколи не потребував root-privelages для установки через pip.
Роб Труксал

12
@Rob Truxal Я думаю, сенс у тому, що пакет не буде бачити інші користувачі. Можливо, вам потрібна старіша / новіша версія пакету, але якщо ви встановите його в системі, ви збираєтеся вимкнути своїх товаришів по роботі.
NDEthos

4
ой! --userПари про користувальницької ізоляції! Це робить схожим на дотепну силу сенсу. Дякую @NDEthos!
Роб Труксал

ОК, ось питання (noobish): припустимо, я зареєструвався як foo користувача, а потім запустив цю команду pip install --user -r требования.txt .. і все встановлено просто чудово. Тоді я ввійшов як панель користувачів, і запустив програму python так: sudo -u foo ./odoo-bin .. Чи буде він читати з пакунків python, встановлених для користувача foo? або як це працює?
абат

1
чи існує спосіб перерахувати лише ті пакунки, які встановлені для поточного користувача? тобто щось подібне pip freeze --user?
абат

24

--userвстановлюється в site.USER_SITE.

Для мого випадку це було /Users/.../Library/Python/2.7/bin. Тому я додав це до моєї PATH (у ~/.bash_profileфайлі):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin

15

В інших відповідях вказується site.USER_SITE, де розміщуються пакети Python. Якщо ви шукаєте бінарні файли, вони заходять {site.USER_BASE}/bin.

Якщо ви хочете додати цей каталог до шляху пошуку вашої оболонки, використовуйте:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"

14

Просто попередження:

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

Тому не використовуйте pip install --user some_pkg всередині віртуального середовища , інакше віртуальне середовище pipбуде заплутане. Дивіться цю відповідь для отримання більш детальної інформації.


11

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

https://virtualenv.pypa.io/en/stable/


8

На macOS причиною використання --userпрапора є переконання, що ми не пошкодили бібліотеки, на які покладається ОС. Консервативний підхід для користувачів багато чого MacOS, щоб уникнути установок або оновлень пипа з командою , яка вимагає sudo. Таким чином, це включає встановлення на /usr/local/bin...

Посилання: Установка python для Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Мені не все зрозуміло, чому встановлення в /usr/local/binMac - це ризик на Mac, враховуючи той факт, що система покладається лише на бінарні файли python у /Library/Frameworks/та /usr/bin. Я підозрюю, що це тому, що, як зазначалося вище, установка в /usr/local/binвимагає, sudoщо відкриває двері до дорогої помилки з системними бібліотеками. Таким чином, встановлення в ~/.local/binце безпечний спосіб пожежі, щоб уникнути цього ризику.

Посилання: Використання python на Mac ( https://docs.python.org/2/using/mac.html )

Нарешті, наскільки є користь від встановлення пакунків у /usr/local/bin, мені цікаво, чи є сенс змінити власника каталогу з rootна user? Це дозволить уникнути необхідності використання sudo, захищаючи від змін, що залежать від системи. * Це за замовчуванням безпека є пережитком того, як системи Unix частіше використовувались у минулому (як сервери)? Або, як мінімум, просто хороший шлях для користувачів Mac, які не розміщують сервер?

* Примітка: функція захисту системної цілісності Mac (SIP) також, схоже, захищає користувача від зміни системних бібліотек.

- Е


8

Без віртуальних середовищ

pip <command> --user змінює область дії поточної команди pip для роботи над локальним місцем встановлення пакета python, а не місцем встановлення пакета, що є типовим.

  • Див. Установки користувачів у Посібнику користувача PIP.

Це дійсно має значення лише на багатокористувацькій машині. Все, що встановлено в системному розташуванні, буде видимим для всіх користувачів, тому при встановленні до місця розташування користувача ця установка пакету буде відокремлена від інших користувачів (вони не побачать його, і їм доведеться встановлювати його окремо, щоб користуватися ним). Оскільки можуть виникати конфлікти версій, установка пакету із залежностями, необхідними для інших пакетів, може спричинити проблеми, тому краще не натискати всі пакунки, якими користувач користується, до місця установки системи.

  • Якщо це машина з однокористувальним користувачем, встановлення до --userмісця розташування мало або взагалі не має різниці . Вона буде встановлена ​​в іншу папку, яку можна або не потрібно буде додавати в шлях, залежно від пакета та способу його використання (багато пакетів встановлюють інструменти командного рядка, які повинні бути на шляху запуску з оболонки) .
  • Якщо це багатокористувацька машина, --userвважається за краще використовувати root / sudo або вимагати встановлення адміністратора та впливати на середовище Python кожного користувача, за винятком випадків загальних пакетів, які адміністратор хоче зробити доступними для всіх користувачів за замовчуванням.
    • Примітка. За коментарями у більшості встановлень Unix / Linux було зазначено, що для встановлення системи слід використовувати загальний менеджер пакунків, наприклад apt, а не pip.

З віртуальними середовищами

--userВаріант в активному середовищі venv / virtualenv буде встановити на локальне розташування користувача Python (ж , як і без віртуального середовища).

Пакети встановлені у віртуальному середовищі за замовчуванням, але якщо ви --userйого використовуєте, це змусить його встановлюватись поза віртуальними середовищами, у каталозі скриптів користувачів python (у Windows, це c:\users\<username>\appdata\roaming\python\python37\scriptsдля мене зараз для Python 3.7).

Однак ви не зможете отримати доступ до інсталяції системи або користувача з віртуального середовища (навіть якщо ви використовувались --userу віртуальному середовищі).

Якщо ви встановите віртуальне середовище з --system-site-packagesаргументом, ви отримаєте доступ до папки системного сценарію для python. Я вважаю, що це включало також папку скриптів користувача python, але я не впевнений. Однак для цього можуть виникнути ненавмисні наслідки, і це не призначений спосіб використання віртуальних середовищ.


Розташування системи Python та папок локальних користувачів

Ви можете знайти місцезнаходження папки для встановлення користувача для python за допомогою python -m site --user-base. Я знаходжу суперечливу інформацію в питаннях і відповідях, документації та фактично використовую цю команду на моєму ПК щодо того, якими є типові параметри, але вони знаходяться під домашнім каталогом користувача ( ~ярлик у * nix і, c:\users\<username>як правило, для Windows).


Інші подробиці

--userВаріант не є допустимим для кожної команди. Наприклад, pip uninstallви знайдете та видаліть пакунки, де б вони не були встановлені (у папці користувача, папці віртуального середовища тощо), і --userпараметр недійсний.

Речі, встановлені з, pip install --userбудуть встановлені в локальному розташуванні, яке буде бачити лише поточний обліковий запис користувача, і не потребуватиме кореневого доступу (на * nix) або доступу адміністратора (у Windows).

Цей --userпараметр змінює всі pip команди, які приймають його, щоб побачити / працювати в папці встановлення користувача, тому, якщо ви використовуєте, pip list --userвін показуватиме лише пакунки, встановлені з pip install --user.


1
Чи могли б ви перефразувати першу частину? Поза віртуального середовища Python найкраще уникати використання pip installбез --userцілісного. Це дозволило б встановити пакети Python у місцях, які дійсно слід залишити менеджеру пакунків системи (наприклад, aptу Debian / Ubuntu). Краще не возитися з цим, це призводить до такої кількості питань. Якщо пакет Python повинен бути доступний для всіх користувачів, тоді використовуйте менеджер пакунків операційної системи, але цього не робіть sudo pip install .... Альтернативою є sudo pip install --target .... У Windows це менше проблеми.
sinoroc

Гаразд - ви маєте на увазі другу половину підсумкової точки кулі у розділі "без віртуальних середовищ"? Якщо ні, то які конкретні частини? (не соромтесь редагувати це безпосередньо для цього оновлення, я передусім не користувач * nix)
LightCC

Я бачу, якщо ви не використовуєте Windows, то це набагато менше турбот, оскільки він насправді не має централізованого менеджера пакунків, якщо ви не почнете використовувати щось на зразок nuget . Я побачу, чи прийду, щоб відредагувати вашу відповідь.
sinoroc

@sinoroc Я додав примітку до цього пункту. Не соромтеся оновлювати його, щоб бути точнішим тощо, або редагувати в іншому місці, якщо у мене є подібні формулювання.
LightCC

1

Чому б просто не помістити виконуваний файл десь у моєму $ PATH

~/.local/bin directoryтеоретично очікується, що буде у вас $PATH.

За словами цих людей, це помилка, не додаючи її під $PATHчас використання systemd.

Ця відповідь пояснює це більш широко.

Але навіть якщо ваш дистрибутив включає в ~/.local/binкаталог до$PATH , це може бути в наступному вигляді (всередині ~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

що вимагатиме від вас виходу з системи та входу знову , якщо каталог раніше не був.

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