pip/python:普通的site-packages不可写

133

我买了一台新的Macbook,之前有一个用户安装过系统,后来我又添加了一个新的用户(我的),给予管理员权限并删除了旧用户。我现在使用的是Catalina操作系统。

自从安装完成后,我遇到了许多权限问题。VSCode找不到Jupyter Notebook,pip将软件包安装在~/Library/Python/3.7/site-packages中。

当我运行which python3时,返回的是usr/bin/python3。 当我运行pip3 install <package>时,返回:Defaulting to user installation because normal site-packages is not writeable,然后它说已经安装过了,但是当我运行import <package>时无法访问。

这显然是一个权限问题,pip无法安装到“base” Python中,而python无法找到我安装在~/Library/Python/3.7/site-packages中的软件包。

我尝试重新安装操作系统,但由于没有进行清洁安装,所以什么也没有改变。 我漏掉了什么? 我应该如何精确地修复权限?我需要将软件包安装在哪里(venv可以,但我需要全局安装一些软件包,如jupyter)。


1
我也遇到了这个问题。不知道是否与Python 2.7支持的结束有关。 - Chris Dutrow
6
你确定你正在使用正确的 pip 吗?如果你使用更安全的 python -m pip install .... 会怎样呢? - Tom de Geus
5
在这种情况下,您需要使用“python3 -m pip install ...”命令进行安装,但是当涉及多个Python版本时,通过“exec模块”方法调用“pip”会更加安全,因此您可以确保使用预期的Python可执行文件。 - ShadowRanger
2
为了解决这个问题,我最终卸载了之前使用brew安装的python3,并使用pyenv安装了python3。现在一切都正常了。我遵循了这个指南:https://opensource.com/article/19/5/python-3-default-mac(跳到最后一节)。 - Arseny Levin
18个回答

62

正如@TomdeGeus在评论中提到的,这个命令对我有效:

Python 3:

python3 -m pip install [package_name]

Python 2:

python -m pip install [package_name]

4
谢谢,通过在命令开头添加Python已经帮助我解决了问题。 - Reza
47
我仍然遇到了这个问题,尽管我正在使用来自这个答案的命令。 - Jan Pisl
也没有帮助我。 - eastonsuo
对于那些使用工作/学校笔记本电脑的人,这只是我个人的建议 - 确保您有写入权限到Python安装目录(例如,如果您的管理员锁定了C:\ProgramFiles\Python36)... - Salvatore
这很优雅:让你想要增强的Python安装执行pip。在Catalina上,我使用由Mac Ports安装的python3.9测试成功。 - Johannes Overmann
显示剩余2条评论

29
最好不要直接使用系统提供的Python。因为操作系统可能会以不希望的方式更改它,就像您所经历的那样。最佳做法是配置自己的Python版本,并使用virtualenv(对于Python 2)或venv(对于Python 3),可能通过poetry进行每个项目的管理。这消除了对系统提供的Python版本的所有依赖,并将每个项目与机器上的其他项目隔离开来。如果需要,每个项目可以有不同的Python点版本,并获得自己的site_packages目录,因此pip安装的库也可以按项目具有不同版本。这种方法是避免主要问题的方法。

1
我曾经遇到过同样的问题,而且我也设置了虚拟环境venv。我所需要做的就是在我的虚拟环境“venv”中执行pip命令,具体如下:.venv/bin/pip install -r pypackages.txt - FernandoTrinciante
8
@chris-johnson: 你说的都有道理,但我应该怎么做呢?在我的新MBP M1上,在venv中尝试执行pip3 install gjango时,我收到了以下错误消息:Defaulting to user installation because normal site-packages is not writeable ERROR: Could not find a version that satisfies the requirement gjango (from versions: none) ERROR: No matching distribution found for gjango - YCode

29

python3.7 -m pip install [package_name]

当然,你需要使用你所拥有的版本。

这个方法对我有用,但是最受欢迎的答案 python3 -m pip install [package_name] 在这里没有帮助。

在我的情况下,这是由于与支配的 3.6 版本发生冲突,这个版本还作为默认版本安装。你可能会问自己为什么系统上有 3.6 版本,你现在几乎不会使用那个版本。原因是,许多包安装程序将 3.6 用作独立的默认 Python 版本,这些安装程序不想检查您使用的是哪个版本以及是否匹配,他们只是默认使用 3.6 版本,不管你喜不喜欢。

这是一个例子证明了这一点,--upgrade pip:

pip3 install --upgrade pip

默认使用用户安装,因为正常的 site-packages 不可写
要求已满足: pip in /home/USERNAME/.local/lib/python3.6/site-packages (20.3.1)

python3 -m pip install --upgrade pip

默认使用用户安装,因为正常的 site-packages 不可写
要求已满足: pip in /home/USERNAME/.local/lib/python3.6/site-packages (20.3.1)

python3.7 -m pip install --upgrade pip

收集 pip
缓存条目反序列化失败,被忽略的条目
使用缓存 https://files.pythonhosted.org/packages/ab/11/2dc62c5263d9eb322f2f028f7b56cd9d096bb8988fcf82d65fa2e4057afe/pip-20.3.1-py2.py3-none-any.whl
安装已收集的软件包: pip 成功安装 pip-20.3.1


3
是的... python3 有问题,但切换到调用 python3.9 解决了问题。真是痛苦... - dat
8
很遗憾,这对我来说在 python3.10 上不起作用。 - Hercislife

9

我在Ubuntu上使用Anaconda,遇到了同样的问题。我通过以下步骤解决了它:

1. 取消当前环境

conda deactivate

然后,基本环境会被激活。我也停用了基本的conda环境。为此,我再次使用 conda deactivate 命令。

最后,我通过以下命令直接激活我的项目环境(而不是从基本环境激活),之后成功安装了预期的软件包并正常工作。

conda activate myenv
pip install somepackage

这个东西真是太好用了。不过我很好奇为什么它能起作用。 - Sean Yun-Shiuan Chuang

8

sudo pip install

这对我来说有效。但是不建议使用sudo运行pip install。我在BIGSUR上遇到的问题是,它正在使用系统Python。一旦我使用下面的命令安装了Python 3.9:

brew install python@3.9

然后pip就可以正常工作了。


2

针对那些无意中更新了系统 pip 的读者:

如果您在终端输出中看到以下信息:

Defaulting to user installation because normal site-packages is not writeable

如果你更新了pip3,那么你就没问题了。使用你刚刚更新的pip3运行以下命令:

pyenv global system # since I use pyenv
pip3 uninstall pip # this one does the trick

然后您可以再次检查 pip3 --version,它将指向原始的旧版(XCode/System-)pip。例如(2022/2/28):

pip 20.2.3 from /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/pip (python 3.8)

4
请问你能解释一下吗? - lalebarde
@lalebarde:简而言之,我们这些天真的用户无法更新系统-pip,因为它对应的site-packages位于受限制的文件夹中(因此我们看到了not writable的消息)。所以,如果你没有看到这个消息,那么你就完蛋了。因为这意味着你在过去某个时刻输入了一些sudo命令来解锁系统文件夹的限制。 - VimNing
我称之为:“如果你被警告了,那么就没问题了。”在处理终端操作时 :) 因为一个设计良好的程序将始终对您的危险行为进行双重检查。 - VimNing
我给这篇帖子点了个踩。请修正一下这篇帖子的标题,因为语法非常糟糕。人们不会“自己思考”。我不能容忍你的粗心。在你修正之后,我会取消我的踩,以便清楚地解释你的回答对读者提供了什么信息。 - Rich Lysakowski PhD

2

对我来说,这些建议都没有用,所以我只能删除当前的虚拟环境文件夹venv并使用以下命令重新创建:

python -m venv venv
python3 -m venv venv

检查Ubuntu 20.04上pip源代码

which pip

返回正确的路径

/home/myname/fullstack/person_api/venv/bin/pip

更新2

我建议使用pyenv来切换不同的Python版本并更好地管理Python路径和安装。

例如:
pyenv install 3.10.4
pyenv global 3.10.4

这可以在未来帮助你避免很多麻烦。

更新 1

我猜想有些人可能会遇到这个问题,因为他们将 Python 路径设置为环境变量,像这样在~/.bashrc中:

python=/path/to/python

你不应该这样做!相反,我们可以这样做:
py=python
PATH=/path/to/python:$PATH

我之所以遇到了这个问题,是因为这个原因!


解决了我的问题,Defaulting to user installation because normal site-packages is not writeable - 太棒了!谢谢! :) - Joachim

2

当我虚拟环境文件夹名字为:venv时,会出现以下错误:

No module pip

Default folder is unwritable

将文件夹重命名即可解决问题。


当我将命令更改为python -m venv my-venv时,它对我完美地工作。 - LionsDen

2

在命令行中输入 "which python" 命令,查看是否得到预期的值。如果您已经激活了虚拟环境,请检查 /venv/bin/activate 文件中 VIRTUAL_ENV= 的值,并确保它是正确的路径。如果您重命名或移动了项目,则路径可能会出错。如果路径错误,您可以删除 venv 并创建一个新的。


我也遇到过这个问题:我激活了虚拟环境,然后移动了它的目录,之后 pip 就无法检测到虚拟环境,试图在系统级别安装。我只需要执行 deactivate 然后 source path-to-venv/bin/activate,问题就解决了。 - Lenormju

1

在新安装的Debian 9.12上遇到了同样的问题。重新启动服务器解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接