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

wqnecbli  于 2023-06-04  发布在  Python
关注(0)|答案(9)|浏览(734)

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中呢?

6g8kf2rb

6g8kf2rb1#

pip默认将Python包安装到系统目录(如/usr/local/lib/python3.4)。这需要root访问权限。
--user使pip安装包在您的主目录中,这不需要任何特权。

eoxn13cs

eoxn13cs2#

只是一个警告:
根据这个问题,--user目前在虚拟环境的pip中是无效的,因为用户位置对于虚拟环境没有意义。
所以不要在虚拟环境中使用pip install --user some_pkg**,否则虚拟环境的pip会被混淆。请参阅this answer了解更多详细信息。

noj0wjuj

noj0wjuj3#

--user安装在site.USER_SITE中。
在我的例子中,它是/Users/.../Library/Python/2.7/bin。所以我把它添加到我的PATH(在~/.bash_profile文件中):

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

lsmepo6l4#

无虚拟环境

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

  • 请参见《PIP用户指南》中的用户安装。

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

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

使用虚拟环境

  • 在Python Packaging文档中查看有关使用虚拟环境安装包的更多信息。
  • 了解如何创建和使用虚拟环境,以及venv命令in the Python VENV docs

活动venv/virtualenv环境中的--user选项将安装到本地用户python位置(与没有虚拟环境时相同)。
默认情况下,包会安装到虚拟环境中,但如果您使用--user,它将强制它安装在虚拟环境之外,在用户的python脚本目录中(在Windows中,对于我来说,使用Python 3.7时,这是c:\users\<username>\appdata\roaming\python\python37\scripts)。

但是,您将无法从虚拟环境中访问系统或用户安装(即使您在虚拟环境中使用--user)。

如果你安装了一个带有--system-site-packages参数的虚拟环境,你将可以访问python的系统脚本文件夹。我相信这也包括用户python脚本文件夹,但我不确定。然而,这可能会产生意想不到的后果,并且这不是使用虚拟环境的预期方式。

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

您可以使用python -m site --user-base找到python的用户安装文件夹的位置。我在Q&A的文档中发现了相互矛盾的信息,实际上在我的PC上使用这个命令来确定默认值是什么,但它们位于用户主目录下(*nix中的~快捷方式,以及通常用于Windows的c:\users\<username>)。

其他详情

--user选项并非对每个命令都有效。例如,pip uninstall将找到并卸载安装在任何位置的软件包(在用户文件夹、虚拟环境文件夹等),并且--user选项无效。
使用pip install --user安装的东西将安装在仅由当前用户帐户看到的本地位置,并且不需要root访问权限(在 *nix上)或管理员访问权限(在Windows上)。
--user选项修改所有pip命令,接受它查看/操作用户安装文件夹,因此如果您使用pip list --user,它将显示您安装的pip install --user软件包。

vtwuwzda

vtwuwzda5#

其他答案提到site.USER_SITE是放置Python包的地方。如果您正在寻找二进制文件,这些文件放在{site.USER_BASE}/bin中。
如果要将此目录添加到shell的搜索路径中,请用途:

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

yqhsw0fo6#

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

4sup72z8

4sup72z87#

在macOS上,使用--user标志的原因是为了确保我们不会损坏操作系统所依赖的库。对于许多macOS用户来说,一个保守的方法是避免使用需要sudo的命令安装或更新pip。因此,这包括安装到/usr/local/bin ...
参考:为Neovim安装python(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级
g6ll5ycj

g6ll5ycj8#

为什么将包安装到~/.local/会很重要?为什么不把一个可执行文件放在我的$PATH中呢?
~/.local/bin directory理论上应该在$PATH中。
根据these people,这是一个bug在使用systemd时没有将其添加到$PATH中。
This answer更详细地解释了它。
但是即使您的发行版包含~/.local/bin目录$PATH,它也可能是以下形式(在~/.profile内):

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

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

idfiyjo8

idfiyjo89#

如果您使用的是自己的Conda环境,请不要使用--user。如果您使用的是公共Conda环境,请使用--user在您的家中安装软件包~/.local/lib/

相关问题