繁体   English   中英

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

[英]What is the purpose of "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 主题的可怕虫洞。

--user用简单的英语表达的目的是什么? 为什么将 package 安装到~/.local/很重要? 为什么不把可执行文件放在我的$PATH某处?

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

--user而是在您的主目录中制作 pip 安装包,这不需要任何特殊权限。

--user安装在site.USER_SITE

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

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

只是一个警告:

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

所以不要在虚拟环境中使用pip install --user some_pkg ,否则虚拟环境的pip会被混淆。 有关更多详细信息,请参阅此答案

其他答案提到site.USER_SITE作为放置 Python 包的位置。 如果您正在寻找二进制文件,请访问{site.USER_BASE}/bin

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

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

没有虚拟环境

pip <command> --user更改当前 pip 命令的范围以在当前用户帐户的本地 python 包安装位置上工作,而不是系统范围的包安装位置,这是默认值。

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

  • 如果是单用户机器,安装到--user位置几乎没有区别。 它将安装到不同的文件夹中,可能需要或可能不需要将其添加到路径中,具体取决于包及其使用方式(许多包安装命令行工具,这些工具必须位于从 shell 运行的路径上) .
  • 如果它是一个多用户的机器, --user最好使用根/须藤或需要管理员安装和影响着每一个用户的Python环境,除了在普通包装的情况下,该管理员希望提供给默认情况下,所有用户.
    • 注意:根据评论,在大多数 Unix/Linux 安装中已经指出系统安装应该使用通用包管理器,例如apt ,而不是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 的用户安装文件夹的位置。 我在问答、文档和实际在我的 PC 上使用此命令时发现了关于默认值的冲突信息,但它们位于用户主目录下(*nix 中的~快捷方式和c:\\users\\<username>通常用于 Windows)。


其他详情

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

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

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

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

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

在 macOS 上,使用--user标志的原因是为了确保我们不会破坏操作系统所依赖的库。 许多 macOS 用户的保守方法是避免使用需要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//usr/bin 我怀疑这是因为如上所述,安装到/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

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

~/.local/bin directory理论上应该在你的$PATH

根据这些人说法,是一个错误,在使用systemd时未将其添加到$PATH

这个答案更广泛地解释了它。

即使您的发行版包含~/.local/bin目录$PATH ,它也可能采用以下形式(在~/.profile ):

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

这将要求您在第一次创建目录时注销并再次登录。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM