“pip install --user ...”的目的是啥?

Posted

技术标签:

【中文标题】“pip install --user ...”的目的是啥?【英文标题】:What is the purpose of "pip install --user ..."?“pip install --user ...”的目的是什么? 【发布时间】:2017-08-16 18:29:51 【问题描述】:

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

【问题讨论】:

您可以import site; print site.USER_SITE 打印安装位置。对我来说,我得到了/$HOME/.local/lib/python$PY_MAJOR.$PY_MINOR/site-packages 在主机上,/usr/local/lib/pythonX.X/dist-packagespip 安装的软件包的默认目录。但如果一位用户想要安装用户特定的软件包,他们可以使用$ sudo pip3 --user install some_package。访问该主机的群组和其他人将无法使用该软件包。 【参考方案1】:

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

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

【讨论】:

谢谢;这就说得通了。但是--user 的目的是确保不以 root 身份运行包吗? (我想像 Wireshark/kismet/burpsuite 之类的选项来设置组访问策略,从而不允许所有程序功能以 root 身份运行。这是在正确的轨道上吗?)或者是 --user选项只是为了允许没有root权限的安装?如果是这样,我为什么不使用sudo pip install foo_package?我以前从来不需要通过 pip 安装 root-privelages。 @Rob Truxal。我认为关键是该软件包不会被其他用户看到。也许您想要一个较旧/较新版本的软件包,但如果您将它安装在系统上,您将搞砸您的同事。 哦! --user 参数是关于用户隔离的!这就像一个荒谬的意义。谢谢@NDEthos! 好的,这是一个(noobish)问题:假设我以 foo 用户身份登录,然后我运行了这个命令 pip install --user -r requirements.txt.. 一切都安装得很好.然后我以用户 bar 的身份登录,并像这样运行 python 程序: sudo -u foo ./odoo-bin .. 它会从为 foo 用户安装的 python 包中读取吗?或者它是如何工作的? 还有没有办法只列出为当前用户安装的包?比如pip freeze --user?【参考方案2】:

--user 安装在 site.USER_SITE 中。

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

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

【讨论】:

【参考方案3】:

只是一个警告:

根据this issue,--user 目前在虚拟环境的pip 中无效,因为用户位置对于虚拟环境没有真正意义。

所以不要在虚拟环境中使用pip install --user some_pkg,否则会混淆虚拟环境的pip。详情请见this answer。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

没有虚拟环境

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

请参阅 PIP 用户指南中的 User Installs。

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

如果是单用户计算机,安装到--user 位置几乎没有区别。它将安装到不同的文件夹,可能需要也可能不需要添加到路径中,具体取决于包及其使用方式(许多包安装命令行工具,这些工具必须位于从 shell 运行的路径上) . 如果是多用户机器,--user 优先于使用 root/sudo 或需要管理员安装并影响每个用户的 Python 环境,除非管理员希望让所有人都可以使用通用包默认用户。 注意: 每个 cmets,在大多数 Unix/Linux 安装中,已指出系统安装应使用通用包管理器,例如 apt,而不是比pip.

使用虚拟环境

查看更多关于使用虚拟环境安装软件包的信息in the Python Packaging documentation。 了解如何创建和使用虚拟环境以及venv 命令in the Python VENV docs。

活动 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 选项修改 all pip 命令接受它以查看/操作用户安装文件夹,因此如果您使用pip list --user,它将 显示使用pip install --user 安装的软件包。

【讨论】:

你会考虑改写第一部分吗?在 Python 虚拟环境之外,最好完全避免在没有 --user 的情况下使用 pip install。这会将 Python 包安装在真正应该留给系统包管理器的地方(例如 Debian/Ubuntu 中的apt)。最好不要弄乱这个,这会导致很多问题。如果 Python 包需要对所有用户可用,则使用操作系统的包管理器,但不要使用sudo pip install ...。另一种选择是sudo pip install --target ...。在 Windows 上,这不是问题。 好的——你是指“没有虚拟环境”部分最后一个要点的后半部分?如果不是,具体是哪些部分? (请随意直接为这个更新编辑它,我主要不是 *nix 用户) 我明白了,如果你不使用 Windows,那么它确实没有那么大的问题,因为它实际上并没有集中的包管理器,除非你开始使用类似 nuget。我会看看我是否会过来编辑你的答案。 @sinoroc 我在该段落中添加了注释。如果我有类似的措辞,请随时将其更新为更精确等,或在其他地方进行编辑。 @Timo 如果 Python 安装本身是用户安装而不是系统安装,那么 --user 安装到的位置可能没有区别。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

在 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 中的 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

【讨论】:

【参考方案8】:

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

~/.local/bin directory 理论上应该在您的$PATH 中。

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

This answer 解释得更全面。

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

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

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

【讨论】:

最佳实践是将~/.local/bin 放在系统目录(如/bin/usr/bin)之前还是系统目录之后?如果本地 bin 在路径中较早,则用户最终可能会被替换为使用密码的命令(例如 passwd、ssh、scp 等)欺骗。

以上是关于“pip install --user ...”的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习_安装opencv

Scipy - Python library - Math tool - Begin

关于光的反射和折射的例子?

既是3的倍数又是5的倍数都有哪些

一个三位数既是3的倍数,又是5的倍数。这样的三位数最小是啥

数组的创建,及数组的方法