Какова цель «pip install --user…»?

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.)

Документация для site.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). Это требует root-доступа.

--user вместо этого создает пакеты pip install в вашем домашнем каталоге, что не требует никаких особых привилегий.

сумеречный
источник
1
Спасибо; в этом есть смысл. Но стоит --userли быть уверенным, что пакет не запускается от имени пользователя root? (Я представляю что-то похожее на опции Wireshark / kismet / burpsuite для настройки политик группового доступа, тем самым не позволяя всем функциям программы работать от имени пользователя root. Это на правильном пути?) Или эта --userопция просто подразумевается чтобы позволить установку без привилегий суперпользователя? Если это так, почему я никогда не использую sudo pip install foo_package? Я никогда не нуждался в root-привилегиях для установки через pip.
Роб Труксал
12
@Rob Truxal. Я думаю, дело в том, что этот пакет не увидят другие пользователи. Может быть, вы хотите более старую / более новую версию пакета, но если вы установите его в системе, вы собираетесь испортить своих рабочих партнеров.
NDEthos
4
ой! Параметр --userо изоляции пользователя! Это похоже на смешной смысл. Спасибо @NDEthos!
Роб Труксал
Хорошо, вот (noobish) вопрос: предположим, что я вошел в систему как пользователь foo, а затем я выполнил эту команду pip install --user -r needs.txt .. и все установилось просто отлично. Затем я вошел в систему как пользовательская панель и запустил программу на python так: sudo -u foo ./odoo-bin .. будет ли она читать пакеты python, которые были установлены для пользователя foo? или как это работает?
abbood
1
также есть ли способ перечислить только пакеты, которые установлены для текущего пользователя? то есть как то pip freeze --user?
abbood
24

--user устанавливается в site.USER_SITE .

Для моего случая это было /Users/.../Library/Python/2.7/bin. Итак, я добавил это в мой путь (в ~/.bash_profileфайле):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin
Roozbeh Zabihollahi
источник
15

В других ответах упоминается, site.USER_SITEгде находятся пакеты Python. Если вы ищете двоичные файлы, они идут в{site.USER_BASE}/bin .

Если вы хотите добавить этот каталог в путь поиска вашей оболочки, используйте:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"
rgov
источник
14

Просто предупреждение:

Согласно этой проблеме , --userв настоящее время недействительно внутри виртуальной средыpip в виртуальной среде, поскольку местоположение пользователя не имеет смысла для виртуальной среды.

Так что не используйте pip install --user some_pkg внутри виртуальной среды , иначе виртуальная среда pipбудет перепутана. Смотрите этот ответ для более подробной информации.

YaOzI
источник
11

Лучший способ это установить virtualenvи не требовать --userпутаницы. Вы получите больше гибкости и не будете беспокоиться о путанице в различных версиях и проектах Python при каждой установке пакета.

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

user603749
источник
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/binrequire требует sudoоткрытия дорогостоящей ошибки с системными библиотеками. Таким образом, установка в~/.local/bin это верный способ избежать этого риска.

Ссылка: использование python на Mac ( https://docs.python.org/2/using/mac.html )

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

* Примечание. Функция защиты целостности системы (SIP) в Mac также защищает пользователя от изменения системных библиотек.

- E

Эхо Эдмунда
источник
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будут установлены в локальном расположении, которое будет видеть только текущая учетная запись пользователя, и не потребуют доступа с правами root (в * nix) или доступа администратора (в Windows).

В --userопции модифицирует все pip команды , которые принимают его , чтобы увидеть / оперируют пользователя установить папку, так что если вы используете pip list --userэто только покажет вам пакеты , установленные с pip install --user.

LightCC
источник
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

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

Яннис Иоанну
источник