“ pip install --user…”的目的是什么?


188

来自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
Trevor Boyd Smith,

1
在主机上,/usr/local/lib/pythonX.X/dist-packagespip安装的软件包的默认目录。但是,如果一个用户想要安装用户特定的软件包,则可以使用$ sudo pip3 --user install some_package。该软件包将对团体和访问该主机的其他人不可用。
noobninja

Answers:


223

pip默认将Python软件包安装到系统目录(例如/usr/local/lib/python3.4)。这需要root访问。

--user 而是在您的主目录中进行pip安装软件包,该软件包不需要任何特殊特权。


1
谢谢; 这就说得通了。但是,--user要确保没有以超级用户身份运行该程序包是有道理的吗?(我在想像类似于Wireshark / kismet / burpsuite选项的选项来设置组访问策略,从而不允许所有程序功能都以root身份运行。这是否在正确的轨道上?)或该--user选项仅意味着以允许没有root权限安装?如果是这样,我为什么不使用sudo pip install foo_package?以前我从来不需要root特权通过pip进行安装。
罗布·特鲁萨尔

12
@Rob Truxal。我认为关键是该软件包不会被其他用户看到。也许您想要一个较旧/较新版本的软件包,但是如果您将其安装在系统上,则将使您的同事变得虚假。
NDEthos

4
哦!该--user参数是关于用户隔离!那使人感觉有些荒谬。谢谢@NDEthos!
罗布·特鲁萨尔

好的,这是一个(讨厌的)问题:假设我以foo用户身份登录,然后运行了以下命令pip install --user -r requirements.txt ..一切都安装好了。然后我以用户栏身份登录,并像这样运行python程序:sudo -u foo ./odoo-bin ..它会从为foo用户安装的python包中读取信息吗?或如何运作?
Abbood

1
还有没有办法只列出为当前用户安装的软件包?即像pip freeze --user什么?
Abbood


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会被混淆。有关更多详细信息,请参见此答案



8

在macOS上,使用该--user标志的原因是确保我们不会破坏OS依赖的库。一个保守许多的MacOS用户的做法是为了避免在安装或使用,需要一个命令更新点子sudo。因此,这包括安装到/usr/local/bin...

参考:为Neovim安装python(https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim

我不是所有清楚为什么安装到/usr/local/bin是鉴于该系统只依赖于蟒蛇的二进制文件在Mac上的危险/Library/Frameworks//usr/bin。我怀疑是因为如上所述,安装到/usr/local/binrequire sudo可以打开导致系统库代价高昂的错误的大门。因此,安装到内部~/.local/bin是避免这种风险的可靠方法。

参考:在Mac上使用python(https://docs.python.org/2/using/mac.html

最后,程度有安装软件包到的好处/usr/local/bin,我不知道它是有道理的,从改变目录的所有者rootuser这样可以避免必须使用,sudo同时仍可以防止进行依赖于系统的更改。*这是否是安全性默认设置,它是过去更频繁地使用Unix系统(作为服务器)的结果吗?或者至少,对于不托管服务器的Mac用户,这是一个好方法吗?

*注意:Mac的系统完整性保护(SIP)功能似乎还可以保护用户免于更改依赖于系统的库。

-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。我在“问题与解答”,文档中发现有冲突的信息,并且实际上在PC上使用此命令来确定默认值,但它们位于用户主目录(~* nix中的快捷方式,c:\users\<username>通常用于Windows)下。


其他详情

--user选项并非对每个命令都有效。例如,pip uninstall将在安装了软件包的位置(用户文件夹,虚拟环境文件夹等)中查找和卸载软件包,并且该--user选项无效。

随同pip install --user安装的东西将安装在本地位置,该位置只能由当前用户帐户查看,并且不需要root用户访问权限(在* 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我在该段中添加了注释。请随意更新它以使其更加精确,等等,或者如果我有类似的措辞,请在其他位置进行编辑。
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

如果该目录以前不在目录中,则需要注销并再次登录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.