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

时间:2017-03-23 23:44:41

标签: python bash pip

来自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中放置一个可执行文件?

8 个答案:

答案 0 :(得分:115)

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

--user会在您的主目录中生成pip安装包,而不需要任何特殊权限。

答案 1 :(得分:15)

--user安装在site.USER_SITE

就我而言,它是/Users/.../Library/Python/2.7/bin。所以我已将其添加到我的PATH(在~/.bash_profile文件中):

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

答案 2 :(得分:7)

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

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

我不是所有明确为什么安装到/usr/local/bin是一个MAC的风险,因为系统只依赖/Library/Frameworks/和{{{{}}中的python二进制文件1}}。我怀疑是因为如上所述,安装到/usr/bin需要/usr/local/bin,这为系统库造成代价高昂的错误打开了大门。因此,安装到sudo是避免这种风险的可靠方法。

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

最后,在某种程度上,将包安装到~/.local/bin是有好处的,我想知道将目录的所有者从/usr/local/bin更改为root是否有意义? 这样可以避免使用user,同时仍然可以防止进行依赖于系统的更改。 *这是一个安全默认值,它是过去经常使用Unix系统的遗留物(作为服务器) )?或者至少,对于没有托管服务器的MAC用户来说,这是一个好方法吗?

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

- E

答案 3 :(得分:5)

其他答案提到site.USER_SITE是放置Python软件包的位置。如果您要查找二进制文件,请输入{site.USER_BASE}/bin

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

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

答案 4 :(得分:1)

最好的方法是安装virtualenv,而无需引起--user的困惑。您将获得更大的灵活性,而不必担心每次pip安装软件包时都会破坏不同的python版本和项目。

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

答案 5 :(得分:1)

只是警告:

根据this issue--user在虚拟环境pip中目前无效,因为用户位置对于虚拟环境而言实际上没有任何意义。

因此请勿在虚拟环境中使用pip install --user some_pkg ,否则,虚拟环境的pip将会引起混淆。有关更多详细信息,请参见this answer

答案 6 :(得分:1)

没有虚拟环境

pip <command> --user更改当前pip命令的范围,使其可以在当前用户帐户的本地python软件包安装位置上使用,而不是在系统范围内的软件包安装位置上使用,这是默认设置。

这仅在多用户计算机上才真正重要。安装到系统位置的所有内容都将对所有用户可见,因此,安装到该用户位置将使该软件包安装与其他用户分开(他们不会看到该软件包,因此必须自己单独安装才能使用)。由于可能存在版本冲突,因此安装具有其他软件包所需要的依赖关系的软件包可能会引起问题,因此最好不要将给定用户使用的所有软件包推送到系统安装位置。

  • 如果是单用户计算机,则安装到--user位置几乎没有差异。它将被安装到一个不同的文件夹中,该文件夹可能需要添加,也可能不需要添加到路径中,具体取决于软件包及其使用方式(许多软件包都必须安装命令行工具才能从外壳程序运行) 。
  • 如果它是多用户计算机,则首选--user而不是使用root / sudo或要求管理员安装并影响每个用户的Python环境,除非管理员希望提供常规软件包预设为所有使用者。 注意: 每个注释都指出,在大多数Unix / Linux安装中,系统安装应使用常规软件包管理器,例如apt ,而不是pip

在虚拟环境中

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

默认情况下,软件包已安装到虚拟环境,但是如果使用--user,它将强制将软件包安装在虚拟环境之外的用户python脚本目录中(在Windows中,当前为{{1} }(适用于Python 3.7)。

但是,您将无法从虚拟环境中访问系统或用户安装(即使您在虚拟环境中使用c:\users\<username>\appdata\roaming\python\python37\scripts也是如此)。虽然,如果您使用--user参数安装虚拟环境,则可以访问python的系统脚本文件夹。我相信这也包括用户python脚本文件夹,但是我不确定。

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

您可以使用--system-site-packages找到python的用户安装文件夹的位置。我在“问答”,文档中发现有冲突的信息,并且实际上在PC上使用此命令来查看默认值,但它们位于用户主目录(* nix中的python -m site --user-base快捷方式和{{1} }(通常用于Windows)。

其他详细信息

~选项并非对每个命令都有效。例如,c:\users\<username>将在程序包的安装位置(用户文件夹,虚拟环境文件夹等)中找到并卸载软件包,而--user选项无效。

pip uninstall安装的内容将安装在本地位置,该位置只能由当前用户帐户查看,并且不需要root用户访问权限(在* nix上)或管理员访问权限(在Windows上)。

--user选项会修改所有 pip install --user条命令,这些命令接受该命令以在用户安装文件夹中查看/操作,因此,如果使用--user,它将< strong>仅向您显示安装了pip的软件包。

答案 7 :(得分:1)

为什么不将可执行文件放在我的$ PATH中

~/.local/bin directory理论上预计位于您的$PATH中。

根据these people这是一个错误,在使用$PATH时未将其添加到systemd中。

This answer对其进行了更广泛的解释。

但是即使您的发行版包括了{strong> ~/.local/bin 中的$PATH目录,它也可能位于以下格式(在~/.profile内部):

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

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