“pip install --user ...” 的用途是什么?
- 2025-01-06 08:32:00
- admin 原创
- 94
问题描述:
从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
?
解决方案 1:
pip 默认将 Python 包安装到系统目录(例如/usr/local/lib/python3.4
)。这需要 root 权限。
--user
让 pip 在你的主目录中安装包,这不需要任何特殊权限。
解决方案 2:
只是一个警告:
根据这个问题,--user
目前在虚拟环境中无效pip
,因为用户位置对于虚拟环境来说实际上没有意义。
因此,不要pip install --user some_pkg
在虚拟环境中使用,否则虚拟环境pip
会混淆。有关更多详细信息,请参阅此答案。
解决方案 3:
没有虚拟环境
pip <command> --user
将当前 pip 命令的范围更改为在当前用户帐户的本地 python 包安装位置上工作,而不是默认的系统范围包安装位置。
请参阅PIP 用户指南中的用户安装。
这只在多用户机器上才真正重要。安装到系统位置的任何内容都将对所有用户可见,因此安装到用户位置将使该软件包安装与其他用户分开(他们不会看到它,并且必须自己单独安装才能使用它)。由于可能存在版本冲突,安装具有其他软件包所需依赖项的软件包可能会导致问题,因此最好不要将给定用户使用的所有软件包推送到系统安装位置。
如果是单用户计算机,则安装到该位置几乎没有区别
--user
。它将被安装到不同的文件夹,可能需要或不需要添加到路径中,具体取决于包及其使用方式(许多包安装的命令行工具必须在路径上才能从 shell 运行)。如果是多用户机器,
--user
则最好使用 root/sudo 或要求管理员安装并影响每个用户的 Python 环境,除非管理员希望默认向所有用户提供通用软件包的情况。注意: 根据评论,在大多数 Unix/Linux 安装中,已经指出系统安装应该使用通用包管理器,例如
apt
,而不是pip
。
使用虚拟环境
有关使用虚拟环境安装包的更多信息,请参阅Python 打包文档。
阅读有关如何创建和使用虚拟环境以及Python VENV 文档中的
venv
命令。
活动 venv/virtualenv 环境中的选项--user
将安装到本地用户 python 位置(与没有虚拟环境时相同)。
默认情况下,包会安装到虚拟环境中,但如果使用--user
它会强制将其安装在虚拟环境之外,在用户的 python 脚本目录中(在 Windows 中,目前对`c:/users<username>appdata
oamingpythonpython37scripts`我来说是 Python 3.7)。
但是,您将无法从虚拟环境内访问系统或用户安装(即使您--user
在虚拟环境中使用)。
如果您使用该参数安装虚拟环境--system-site-packages
,您将可以访问 Python 的系统脚本文件夹。我相信这也包括用户 Python 脚本文件夹,但我不确定。但是,这可能会产生意想不到的后果,而且这不是使用虚拟环境的预期方式。
Python 系统和本地用户安装文件夹的位置
您可以使用 找到 python 用户安装文件夹的位置python -m site --user-base
。我在问答、文档以及在我的 PC 上实际使用此命令时发现了相互矛盾的信息,但默认值位于用户主目录下(~
*nix 中的快捷方式,c:/users<username>
通常用于 Windows)。
其他详细信息
该--user
选项并非对每个命令都有效。例如,pip uninstall
无论软件包安装在何处(在用户文件夹、虚拟环境文件夹等),该--user
选项都无效。
安装的内容pip install --user
将安装在只有当前用户帐户才能看到的本地位置,并且不需要 root 访问权限(在 *nix 上)或管理员访问权限(在 Windows 上)。
该--user
选项修改所有 pip
接受它的命令以查看/操作用户安装文件夹,因此如果您使用pip list --user
它,它将仅显示使用安装的软件包pip install --user
。
解决方案 4:
--user
安装在site.USER_SITE
。
就我的情况而言,它是/Users/.../Library/Python/2.7/bin
。所以我把它添加到我的 PATH 中(在~/.bash_profile
文件中):
export PATH=$PATH:/Users/.../Library/Python/2.7/bin
解决方案 5:
其他答案提到了site.USER_SITE
Python 包的放置位置。如果您要查找二进制文件,则这些文件位于 中{site.USER_BASE}/bin
。
如果要将此目录添加到 shell 的搜索路径,请使用:
export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"
解决方案 6:
最好的方法是安装virtualenv,这样就不需要--user
混淆了。您将获得更大的灵活性,并且不必担心每次使用pip安装包时都会破坏不同的 Python 版本和项目。
解决方案 7:
在macOS上,使用该标志的原因--user
是为了确保我们不会破坏操作系统所依赖的库。对于许多 macOS 用户来说,保守的方法是避免使用需要的命令安装或更新pipsudo
。因此,这包括安装到/usr/local/bin
...
参考:为Neovim安装 Python (为 Neovim 设置 Python)
我不太清楚为什么在 Mac 上安装到/usr/local/bin
是有风险的,因为系统只依赖于/Library/Frameworks/
和中的 Python 二进制文件/usr/bin
。我怀疑这是因为如上所述,安装到/usr/local/bin
需要sudo
,这为犯系统库代价高昂的错误打开了大门。因此,安装到~/.local/bin
是避免这种风险的万无一失的方法。
参考:在 Mac 上使用 Python(4.在 Macintosh 上使用 Python)
最后,从将软件包安装到 的益处来看,将目录的所有者从更改/usr/local/bin
为 是否有意义? 这样可以避免使用,同时仍可防止进行依赖于系统的更改。 这是 Unix 系统过去更常使用的安全默认设置吗(作为服务器)?或者至少,对于没有托管服务器的 Mac 用户来说,这只是一个不错的选择?root
`user*
sudo`
*注意:Mac 的系统完整性保护(SIP) 功能似乎也可以保护用户免于更改系统相关的库。
解决方案 8:
为什么将包安装到 ~/.local/ 很重要?为什么不直接将可执行文件放在我的 $PATH 中?
~/.local/bin directory
理论上预计在你的$PATH
。
据这些人 说,使用时没有添加它是一个错误。$PATH
`systemd`
这个答案对此进行了更详细的解释。
但即使你的发行版将目录包含~/.local/bin
在内,它$PATH
也可能采用以下形式(在内部~/.profile
):
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
第一次创建目录时,需要您注销并再次登录。
解决方案 9:
如果您使用自己的Conda环境,请不要使用--user
。如果您使用公共 Conda 环境,请使用--user
在家中安装软件包~/.local/lib/
。