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

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主题的可怕虫洞,我不理解。

为什么将包安装到~/.local/很重要?为什么不把一个可执行文件放在我的$PATH的某个地方?

475146 次浏览

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

--user使pip在你的主目录中安装包,这不需要任何特殊权限。

在macOS上,使用--user标志的原因是确保我们不会破坏操作系统所依赖的库。对于许多macOS用户来说,保守的方法是避免使用需要sudo的命令安装或更新pip。因此,这包括安装到/usr/local/bin

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

我不清楚为什么在Mac上安装到/usr/local/bin是一种风险,因为系统只依赖于/Library/Frameworks//usr/bin中的python二进制文件。我怀疑这是因为如上所述,安装到/usr/local/bin需要sudo,这打开了一扇门,在系统库中犯了一个代价高昂的错误。因此,安装到~/.local/bin是避免这种风险的可靠方法。

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

最后,就将包安装到/usr/local/bin的好处而言,我想知道将目录的所有者从root更改为user是否有意义?这将避免不得不使用sudo,同时仍然防止进行依赖于系统的更改。*这是Unix系统过去(作为服务器)更常用的安全默认值吗?或者至少,对于Mac用户来说,这是一个没有服务器的好方法?

*注意:Mac的系统完整性保护(SIP)功能似乎也保护用户不更改系统相关的库。

- E

--user安装在site.USER_SITE中。

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

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

其他答案提到site.USER_SITE是放置Python包的地方。如果你在寻找二进制文件,这些文件会放在{site.USER_BASE}/bin中。

如果你想把这个目录添加到你的shell的搜索路径,使用:

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

最好的方法是安装virtualenv,而不需要混淆--user。您将获得更多的灵活性,而不必担心每次安装包时都会破坏不同的python版本和项目。

< a href = " https://virtualenv.pypa。io / en /稳定/ noreferrer“rel = > https://virtualenv.pypa.io/en/stable/ < / >

只是一个警告:

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

所以不要使用pip install --user some_pkg 在虚拟环境中,否则,虚拟环境的pip将会混淆。更多细节见这个答案

没有虚拟环境

pip <command> --user将当前pip命令的作用域更改为工作在当前用户帐户的本地python包安装位置,而不是默认的系统级包安装位置。

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

  • 如果是单用户机器,安装到--user位置几乎没有区别。它将被安装到不同的文件夹中,可能需要也可能不需要添加到路径中,这取决于包和它的使用方式(许多包安装的命令行工具必须在从shell运行的路径上)。
  • 如果是多用户机器,--user优先于使用root/sudo或要求管理员安装并影响每个用户的Python环境,除非管理员希望默认情况下对所有用户可用的通用包。
    • <强>注意:< / >强 根据评论,在大多数Unix/Linux安装中,已经指出系统安装应该使用通用的包管理器,例如__ABC0,而不是pip

使用虚拟环境

活动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用户安装文件夹的位置。我在Q&A的文档中发现了冲突的信息,实际上在我的PC上使用这个命令的默认值是什么,但它们在用户主目录下(*nix中的~快捷方式,而c:\users\<username>通常用于Windows)。


其他细节

--user选项并非对每个命令都有效。例如,pip uninstall将找到并卸载安装的包(在用户文件夹,虚拟环境文件夹等),而--user选项无效。

使用pip install --user安装的东西将安装在本地位置,只有当前用户帐户才能看到,并且不需要root访问权限(在*nix上)或管理员访问权限(在Windows上)。

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

为什么要安装到~/。本地/重要吗? 为什么不把一个可执行文件放在我的$PATH中?< / p >

~/.local/bin directory理论上是期望在你的$PATH

根据这些人,在使用systemd时,这是个bug没有在$PATH中添加它。

这个答案解释得更广泛。

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

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

这将需要你第一次创建目录时,注销并再次登录。

如果你正在使用自己的conda env,不要使用--user。如果你正在使用公共conda env,使用--user在你的家中~/.local/lib/安装pgs。