OSX El Capitan: sudo pip install OSError: [Errno: 1] Operation not permitted 操作系统:OSX El Capitan 命令:sudo pip install 错误信息:OSError: [Errno: 1] 操作不允许

131

当我运行:

sudo pip install ipython

我遇到了以下错误

OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

上一个执行的命令尝试创建上述目录。

此外,以下命令无法安装iPython,也没有提供任何错误提示。

sudo pip install --user python

(我使用的是Mac OS X El Capitan,如果其他使用这个操作系统的人也遇到了同样的问题。)


我已经添加了一个答案,解释了如何修改您的 $PATH,以便您可以调用已安装的--user软件包的可执行文件。https://dev59.com/yVwY5IYBdhLWcg3wHkmK#47102398 - Bruno Bronosky
2
不应该在 --user 中使用 sudo--user 的作用是安装到 ~/Library 而不是 /Library,您不必使用 sudo 在那里安装。但是一旦您使用 sudo 安装,目录和文件都归 root 所有。然后您必须使用 sudo 来对它们进行任何其他操作。这反过来又需要您为其他不应该使用的事情使用 sudo。然后即使是一个诚实的错误也可能从抛出一个错误变成破坏数据。 - Bruno Bronosky
12个回答

209

使用sudo pip install的指令是本质上错误的。

图片描述

如果有任何教程告诉你要使用sudo pip,请投诉此软件包。作者正在误导Python社区,因为时间已经证明了sudo pip是一种错误做法。

OSX El Capitan引入了机制以防止损坏操作系统文件/System/Library/Frameworks/Python.framework/Versions/2.7/share是受保护的位置之一。普通用户没有理由在那里放置或写入任何文件。这是因为操作系统本身依赖于这些文件,而sudo pip会无条件地覆盖它们。通常情况下不会发生大问题,但并非没有可能性。苹果公司希望保护他们的操作系统用户免受意外破坏他们的安装。

相反,您需要将Python包(例如IPython)安装到本地用户的主目录中。最简单的方法是创建虚拟环境激活它,然后在虚拟环境中运行pip

例如:

cd ~  # Go to home directory
virtualenv my-venv
source my-venv/bin/activate
pip install IPython

更多信息

或者,您可以使用pip install --user。 但是,请注意,不需要sudo,您需要手动设置PATH环境变量。


5
如果不需要使用 virtualenv 并且想要在全局(例如 /Library/Python/2.7/site-packages)安装模块,可以尝试使用 easy_install 来安装模块,具体方法可以参考下面链接中我提供的解决方案:https://dev59.com/yVwY5IYBdhLWcg3wHkmK#33463702 - smat88dd
3
你有没有关于“sudo pip”不好的这种观点的引用(“随着时间的证明,sudo pip是一种错误的做法”)?我没有看到你提供的引文中有任何sudo的讨论,而且教程将创建虚拟环境的第一步列为“pip install virtualenv”,这似乎在尝试按照你的建议时会产生循环依赖。 - Von
1
@MikkoOhtamaa,我相信你的话,但这会限制教育的范围。如果官方Python文档中有这个内容,将大大提高传播效果。虽然我不是开发人员,但我认为自己对Python和pip有一定了解,直到看到你的评论之前,我从未听说过这个问题。此外,我也很想了解人们遇到的问题,因为我曾经使用“sudo pip”修改系统安装一段时间,没有注意到任何问题(现在我不再使用,而是改用homebrew,关于文件所有权的另一个故事...)。 - Von
29
恕我直言,这并没有回答原来的问题。我正在尝试安装IPython并使其全局可用(适用于我机器上的所有用户),但无论是虚拟环境还是“pip install --user IPython”都无法解决。此外,“pip install --user IPython”未能将“ipython”命令放置在“$PATH”中(至少在我的机器上如此)。 - jpetazzo
3
你教会了我,并且还节省了我的时间。非常感谢。 我停止使用sudo,一切正常!很棒的答案。 - Parth Gupta
显示剩余16条评论

24

我有同样的问题,但使用easy_install "module"为我解决了问题。

我不确定为什么,但是pipeasy_install使用不同的安装位置,而easy_install选择了正确的位置。

编辑:没有重新检查但是因为评论的缘故,似乎不同的(OSX和brew安装)安装相互干扰,这就是为什么所提到的工具指向不同位置(因为它们属于不同的安装)。我知道通常那些工具来自于同一个安装指向同一个文件夹。


很可能pipeasy_install指向不同的Python。您可以使用which UNIX命令找出问题,然后找到正确的pip命令来使用。 - Mikko Ohtamaa
/usr/local/bin/pip -V 显示 pip 7.1.2,来自 /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7),而 /usr/bin/easy_install-2.7 --version 显示 setuptools 1.1.6。我注意到路径不同(一次是 usr/bin,一次是 usr/local/bin),但不知道原因。 - smat88dd
/usr/bin 是 OSX Apple 供应的系统级路径,你无法进行写入操作。 /usr/local/bin 最有可能是 Homebrew 安装的路径,这才是开发者所需要的。 - Mikko Ohtamaa
1
可能是升级之前旧版OSX的先前安装? - Mikko Ohtamaa
1
pip和easy_install使用不同的安装位置 - 不,它们使用完全相同的位置。这只是偶然发生的,正如@MikkoOhtamaa在他的评论中试图向您展示的那样。这显然不是一个答案。 - Piotr Dobrogost
显示剩余8条评论

19

你应该重新安装Python:

brew reinstall python

获取brew,请查看brew主页


我同意。我运行了 brew install python,然后认为 pip 已经就位。之后 pip 安装成功了(我之前也遇到过权限问题和 pip 在安装时退出的类似问题)。 - travelingbones

15

在我的情况下,我还需要执行pip install --ignore-installed setuptools - ithos67
2
不行,这样做是不行的,因为缺少权限。 - Piotr Dobrogost

13

使用 pip3 install <包名> 代替,同时使用 pip 解决权限问题。


11
FYI,这个操作成功是因为 pip3 使用的是 Python 3 版本,而通常情况下用户会自行安装 Python 3。另一方面,macOS 系统已经预装了 Python 2 (2.7),正如最佳答案所解释的那样,这也是受到保护的。 - Khanh Nguyen

10

TL;DR $PATH修复

  1. 使用pip install --user package_name安装应包括CLI可执行文件的软件包。
  2. 启动Python shell并import package_name
  3. 在输出中找到lib/python/...出现的位置,并将其全部替换为bin
  4. 很可能是$HOME/Library/Python/2.7/bin

细节

由于macOS 10.11 El Capitan中的新系统完整性保护,您不能再使用sudo pip install。我们不会在此讨论其优点。

另一个答案解释了你应该使用pip install --user,这是正确的。但是他们让你去背街小巷找出如何处理$PATH,以便您可以访问已安装的可执行文件。幸运的是,我已经解决了一个无关问题的类似需求

以下是我在我的一台计算机上解决问题的记录。我包含了所有内容而不仅仅是对我有效的$PATH,因为您的系统可能与我的不同。此过程适用于每个人。

$ pip install --user jp
Collecting jp
  Downloading jp-0.2.4.tar.gz
Installing collected packages: jp
  Running setup.py install for jp ... done
Successfully installed jp-0.2.4

$ python -c 'import jp; print jp'
<module 'jp' from '/Users/bbronosky/Library/Python/2.7/lib/python/site-packages/jp/__init__.pyc'>

$ find /Users/bbronosky/Library/Python -type f -perm -100
/Users/bbronosky/Library/Python/2.7/bin/jp

$ which jp

$ echo -e '\n''export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bashrc

$ bash # starting a new bash process for demo, but you should open a new terminal

$ which jp
/Users/bbronosky/Library/Python/2.7/bin/jp

$ jp
usage: jp <expression> <filepath>

10

同样的错误

Installing collected packages: six, pyparsing, packaging, appdirs, setuptools
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 323, in clobber
    shutil.copyfile(srcfile, destfile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/six.py'

我在这里使用--user而不用sudo来解决这个问题。

$ pip install --user scikit-image h5py keras pygame
Collecting scikit-image
  Downloading http://mirrors.aliyun.com/pypi/packages/65/69/27a1d55ce8f77c8ac757938707105b1070ff4f2ae47d2dc99461bfae4491/scikit_image-0.13.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (28.1MB)
    100% |████████████████████████████████| 28.1MB 380kB/s
Collecting h5py
  Downloading http://mirrors.aliyun.com/pypi/packages/b7/cc/1c29b0815b12de2c92b5323cad60f724ac8f0e39d0166d0b9dfacbcb70dd/h5py-2.7.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.5MB)
    100% |████████████████████████████████| 4.5MB 503kB/s
Requirement already satisfied: keras in /Library/Python/2.7/site-packages
Requirement already satisfied: pygame in /Library/Python/2.7/site-packages
Requirement already satisfied: matplotlib>=1.3.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from scikit-image)
Requirement already satisfied: six>=1.7.3 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: pillow>=2.1.0 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: networkx>=1.8 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: PyWavelets>=0.4.0 in /Library/Python/2.7/site-packages (from scikit-image)
Collecting scipy>=0.17.0 (from scikit-image)
  Downloading http://mirrors.aliyun.com/pypi/packages/72/eb/d398b9f63ee936575edc62520477d6c2353ed013bacd656bd0c8bc1d0fa7/scipy-0.19.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.2MB)
    100% |████████████████████████████████| 16.2MB 990kB/s
Requirement already satisfied: numpy>=1.7 in /Library/Python/2.7/site-packages (from h5py)
Requirement already satisfied: theano in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: pyyaml in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: python-dateutil in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: tornado in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: pyparsing>=1.5.6 in /Users/qiuwei/Library/Python/2.7/lib/python/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: nose in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: olefile in /Library/Python/2.7/site-packages (from pillow>=2.1.0->scikit-image)
Requirement already satisfied: decorator>=3.4.0 in /Library/Python/2.7/site-packages (from networkx>=1.8->scikit-image)
Requirement already satisfied: singledispatch in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: certifi in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: backports_abc>=0.4 in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Installing collected packages: scipy, scikit-image, h5py
Successfully installed h5py-2.7.0 scikit-image-0.13.0 scipy-0.19.0 

希望这能帮助遇到类似问题的人!


4
不应该在使用--user时使用sudo--user的作用是将安装到~/Library而不是/Library,因此您无需使用sudo来安装。但是,一旦您使用sudo安装,所有目录和文件都归root所有。然后,您必须使用sudo才能对它们进行任何其他操作。这反过来又需要您为不应该使用sudo的其他事情使用sudo。然后,即使是一个诚实的错误也可能从抛出一个错误变成破坏数据。 - Bruno Bronosky

9

我也遇到过同样的问题。 正如其他人所提到的,不要使用sudo运行pip install命令。 执行以下命令:

brew doctor 

并修复警告,您就可以继续进行pip安装了。

6
在El Capitan上让pip正常工作很困难,原因如下:
  1. OS X没有正确设置某些distutils变量,所以pip试图在/System/Library/位置安装辅助文件。而El Capitan会阻止这一操作,这就是你遇到的错误。
  2. OS X在/System/Library/下包含了许多过时的软件包。pip通常想要升级这些软件包,但在El Capitan上无法实现。
  3. OS X把/System/Library/放在python搜索顺序中比/Library/Python/2.7/site-packages(系统范围内的python包位置)更高,因此即使您成功安装了一些软件包的新版本,旧版本仍然会被加载,从而导致某些依赖关系出现问题。
有关所有这些问题的解决方法,请参见https://apple.stackexchange.com/a/223163/143849。但是,您最好通过标准的Python安装程序、Homebrew或Anaconda安装自己的Python版本。

4

我猜你可能跟其他包有冲突。对我来说,是six。所以你需要使用这样的命令:

pip install google-api-python-client --upgrade --ignore-installed six

or

pip install --ignore-installed six


3
你不理解@MikkoOhtamaa提供的回答的哪一部分,导致你仍然建议在使用pip时加上sudo命令? - Piotr Dobrogost
@PiotrDobrogost,为什么你在提问之前不好好阅读呢?我的回答是关于“six”的。 - Ruhul Amin
3
请再说明一下,你不理解@MikkoOhtamaa提供的回答的哪个部分,以至于你仍然建议在使用pip时加上sudo命令? - Piotr Dobrogost

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