"pip install --user ..." 的目的是什么?

386

来自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 的文档是一个令人惊恐的虫洞,包含了我不理解的有趣 Unix 风格的主题。

用通俗易懂的语言来说,--user 的目的是什么?将软件包安装到 ~/.local/ 为什么很重要?为什么不能只是把可执行文件放在我的 $PATH 中的某个地方呢?


5
你可以使用 import site; print site.USER_SITE 命令来打印安装位置。对于我而言,输出结果为 /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages - Trevor Boyd Smith
3
在主机上,/usr/local/lib/pythonX.X/dist-packages 是由 pip 安装的包的默认目录。但如果一个用户想要安装特定于用户的软件包,他们可以使用 $ sudo pip3 --user install some_package。这个软件包将仅对安装它的用户可用,其他访问该主机的组和用户无法访问它。 - noobninja
9个回答

435

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

--user选项使pip将包安装在您的主目录中,而不需要任何特殊权限。


4
谢谢,这很有道理。但是--user的目的是确保不以root身份运行软件包吗?(我想象一下类似Wireshark / kismet / burpsuite选项来设置组访问策略,从而不允许所有程序功能以root身份运行。我这样理解对吗?)还是--user选项只是为了允许在没有root权限的情况下安装?如果是这种情况,为什么我从来没有使用过sudo pip install foo_package?我以前从未需要root权限通过pip进行安装。 - Rob Truxal
26
@Rob Truxal。我认为重点是该软件包不会被其他用户看到。也许您想要一个旧版本或新版本的软件包,但如果您在系统上安装它,就会干扰您的同事的工作。 - NDEthos
12
哦!--user参数是关于用户隔离的!这让人感到非常合理。谢谢@NDEthos! - Rob Truxal
2
好的,这里有一个(新手)问题:假设我以用户 foo 的身份登录,然后运行以下命令 pip install --user -r requirements.txt。一切都正常安装了。然后我以用户 bar 的身份登录,并像这样运行 python 程序:sudo -u foo ./odoo-bin。它会从为 foo 用户安装的 Python 包中读取吗?或者怎么运作? - abbood
2
好的,这就像是一个目标环境。如果包既使用--user安装,又不使用--user安装,那么哪个版本会被使用? - variable
显示剩余7条评论

54

仅供参考:

根据此问题--user 在虚拟环境的 pip 中目前无效,因为用户位置对于虚拟环境来说并没有实际意义。

因此,请勿在虚拟环境中使用 pip install --user some_pkg,否则会导致虚拟环境的 pip 混淆。有关更多详细信息,请参见此答案


那容器内呢?例如,在 Singularity def 文件中通过 pip install --user 安装软件包呢? - Parisa Khateri
如果我想将其安装到该环境内的用户基目录中,我应该怎么做呢? - cloudscomputes

40

--user 安装在 site.USER_SITE

对于我的情况,它是 /Users/.../Library/Python/2.7/bin。所以我已经将其添加到我的 PATH(在 ~/.bash_profile 文件中):

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

36

没有虚拟环境

pip <command> --user 会将当前 pip 命令的作用范围更改为当前用户账户的本地 Python 包安装位置,而不是系统范围的包安装位置(这是默认设置)。

这只在多用户机器上真正重要。任何安装到系统位置的东西都将对所有用户可见,因此安装到用户位置将使该软件包的安装与其他用户分开(他们将看不到它,并且必须单独安装它们以使用它)。因为版本冲突可能会导致问题,所以最好不要将用户使用的所有软件包都安装到系统安装位置。

  • 如果是单个用户的机器,则将其安装到 --user 位置几乎没有区别。它将被安装到不同的文件夹中,可能需要根据软件包和其使用方式将其添加到 path 中(许多软件包安装了必须从 shell 运行的命令行工具)。
  • 如果是多用户机器,建议使用--user选项安装Python包,而不是使用root/sudo或需要管理员权限的安装方式,以免影响每个用户的Python环境。除非是管理员想要默认提供给所有用户的通用包。
    • 注意: 根据评论,在大多数Unix/Linux系统上,系统安装应该使用通用的软件包管理器,如apt,而不是pip

    使用虚拟环境

    • 有关在虚拟环境中安装包的更多信息,请参见Python Packaging文档
    • 阅读有关如何创建和使用虚拟环境以及venv命令的详细信息,请参见Python VENV文档

    在活动的venv/virtualenv环境中使用--user选项将安装到本地用户Python位置(与没有虚拟环境相同)。

    默认情况下,软件包会安装到虚拟环境中,但是如果您使用--user选项,则会强制在虚拟环境之外安装,在用户的Python脚本目录中(在Windows上,这目前为c:\users\<username>\appdata\roaming\python\python37\scripts,我的Python版本为3.7)。

    然而,即使您在虚拟环境中使用了--user选项,也无法从虚拟环境中访问系统或用户安装的库。

    如果您使用--system-site-packages参数安装虚拟环境,则可以访问Python系统脚本文件夹。我认为这也包括用户Python脚本文件夹,但我不确定。但是,这可能会产生意想不到的后果,因此它不是使用虚拟环境的预期方法。


    Python系统和本地用户安装文件夹位置

    您可以使用python -m site --user-base命令找到Python用户安装文件夹的位置。关于默认设置,我在问答、文档中以及在我的电脑上实际使用该命令方面存在互相矛盾的信息,但它们都位于用户主目录下(对于*nix中,是~快捷方式,在Windows上通常为c:\users\<username>)。


    其他细节

    --user 选项不是每个命令都有效。例如,pip uninstall 命令将查找并卸载已安装的软件包(在用户文件夹、虚拟环境文件夹等任何位置),而 --user 选项无效。

    使用 pip install --user 安装的内容将被安装在本地位置,只能被当前用户账户看到,无需管理员访问权限(在 *nix 上)或管理员权限(在 Windows 上)。

    --user 选项修改所有接受它的 pip 命令,以便查看/操作用户安装文件夹,因此如果你使用 pip list --user ,它将显示使用 pip install --user 安装的软件包。


    3
    请问您是否能够重新表达一下开头的部分?在Python虚拟环境之外,最好完全避免使用不带--user选项的pip install命令。否则会将Python包安装在系统程序管理器(例如Debian/Ubuntu中的apt)应该保留的位置,这样做容易出问题。如果需要让所有用户都能使用Python包,则可以使用操作系统的程序管理器,但不要使用sudo pip install ...命令,另一种选择是使用sudo pip install --target ...命令。在Windows上,这个问题并不严重。 - sinoroc
    好的 - 你是指“没有虚拟环境”部分最后一个项目的后半部分吗?如果不是,具体是哪些部分?(随意直接编辑此更新,我不是主要的*nix用户) - LightCC
    我在Windows 10中使用python app,并且pip install pkgpip install pkg --user都安装在c:\users\user\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages。我想知道为什么,因为还有一个C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.1520.0_x64__qbz5n2kfra8p0\Lib\site-packages非用户的?python -m sitec:/progr..放在sys.path中,并将c:/users..放在user_basesys.path中。所以c:/users..既是用户又是非用户? - Timo
    1
    如果Python安装本身是用户安装而不是系统安装,则--user安装的位置可能没有区别。@Timo - LightCC
    在容器内呢?例如,通过在 Singularity def 文件中使用 pip install --user 命令安装软件包,是否真的有所区别呢? - Parisa Khateri
    显示剩余3条评论

    30

    其他答案提到site.USER_SITE是Python软件包的所在位置。如果您正在寻找二进制文件,则这些文件位于{site.USER_BASE}/bin中。

    如果您想将此目录添加到您的shell搜索路径中,请使用:

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

    17

    最好的方法是安装virtualenv,而不需要使用--user参数。这样你将获得更多的灵活性,并且不必担心每次使用pip安装软件包时会覆盖不同的Python版本和项目。


    10
    在 macOS 上,使用 --user 标志的原因是为了确保不破坏操作系统所依赖的库。对于许多 macOS 用户来说,一种保守的做法是避免使用需要 sudo 命令的方式安装或更新 pip。因此,这包括安装到 /usr/local/bin...
    参考:安装 Python for Neovim (设置 Neovim 的 Python)
    我不太清楚为什么在Mac上将程序安装到/usr/local/bin会有风险,考虑到系统只依赖/Library/Frameworks/和/usr/bin/中的Python二进制文件。我猜测这是因为如上所述,将程序安装到/usr/local/bin需要使用sudo,这会打开一个错误操作系统库的大门。因此,将程序安装到~/.local/bin是避免这种风险的绝对方法。
    参考:在Mac上使用Python(4. 在Macintosh上使用Python
    最后,如果将软件包安装到/usr/local/bin目录中有益处,是否有意义将该目录的所有者从root更改为user?这样可以避免在进行系统相关更改时使用sudo,同时仍然保护系统免受损害。这个安全默认设置是Unix系统过去更常用于服务器的遗留物吗?或者至少对于不托管服务器的Mac用户来说,这是一种好方法吗?
    注意:Mac的系统完整性保护(SIP)功能似乎还可以保护用户免受更改系统相关库的影响。

    1

    为什么将软件包安装到~/.local/很重要?为什么不把可执行文件放在$PATH中的某个位置呢?

    ~/.local/bin目录理论上应该在你的$PATH中。

    根据这些人的说法,使用systemd时,不将它添加到$PATH中是一个错误。

    这个答案更详细地解释了它。

    但是即使你的发行版包含了~/.local/bin目录$PATH,它可能以以下形式存在(在~/.profile内):

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

    这将需要您注销并重新登录,第一次创建目录时。

    1
    ~/.local/bin放在PATH中的最佳实践是在系统目录(如/bin/usr/bin)之前还是之后?如果本地bin在路径中较早,则用户可能会被替换为需要密码的命令(例如passwd、ssh、scp等)的欺骗。 - E Gow
    不应该由你决定。如果存在,我的.profile将此目录放在路径的开头。这意味着我个人安装的任何内容都优先于标准安装,这是正确的。 - Francis Cagney

    0

    如果您正在使用自己的Conda环境,请勿使用--user。如果您正在使用公共Conda环境,请使用--user在您的主目录~/.local/lib/中安装软件包。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接