OS X El Capitan升级后如何使用pip?


116

El Capitan更新后,我无法运行pip安装。我得到的错误是在安装过程中pip尝试创建新文件夹时出现“不允许操作”。

creating /System/Library/Frameworks/Python.framework/Versions/2.7/share
    error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted

实际上,通常我无法在这些文件夹中创建文件夹等。尝试使用无济于事的sudo。我也做了

sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/

上面也没有帮助。如何才能再次顺利安装python库?


1
您的系统上的点子在哪里?
标记

$其中pip / usr / local / bin / pip
web_ninja

$ pip --version pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg(python 2.7)
web_ninja

您如何安装pip-应该将其写入/Library/Python/2.7/site-packages而不是/ System
标记

我现在不记得了。发布问题后,我想出了问题,并使用brew安装python并更正了pip的位置。
web_ninja 2015年

Answers:


84

一种快速的解决方案是使用自制软件安装python/usr/local/bin您的系统上,以便您pip可以在用户可修改的python框架上运行。

brew install python
pip --version

禁用系统完整性保护也是一种选择,但是除了专业管理和防火墙服务器之外,我不建议您使用这些服务器来管理入侵检测,如果您是开发人员/系统管理员,并且需要使用或不使用它来进行测试,啜。

ls -lO /System/Library/Frameworks/Python.framework/Versions/2.7/
csrutil status

您会看到设置了受限标志,即使在使用SIP时也不能以root身份被删除。

与系统提供的版本相比,使用自制软件可以分别管理pip和python。另外,自制程序框架旨在通过自动化减轻维护和补丁/杂务的负担。


1
brew安装的python不稳定,并且随机崩溃
jayatubi 2015年

@jayatubi哪个软件包或脚本对您不稳定?您要从brew或python3安装python 2.7.10,而python3刚刚遇到了很大的麻烦,而众所周知却没有向后兼容。如果您更喜欢可以稳定满足您需求的版本,则可以从数十种版本中进行选择。
bmike

1
一致认为brew install python是最简单的选择,虽然清理其他一些设置可能,如果你已经使用该系统的Python一段时间(例如root所有Python文件下需要/usr/local/bin~/Library/Caches/pip
RichVel

在10.8上,从python.org/downloads/release/python-2712下载经过编译的python .pkg 对我来说很好。关于自制软件有何评论?谢谢
丹尼斯

我喜欢@denis,brew因为可以轻松固定您喜欢的版本-管理多个不同的版本或定期进行更新。但是,如果您有适合自己的东西-很难说您应该进行任何更改。
bmike

77

无需禁用SIP或安装其他Python版本的另一可行选择是仅使用的当前用户安装模块

pip install --user <modulename>

如果这只是您的个人计算机,这将是最简单,最安全的解决方案。


1
也许El Capitan提供了/ usr / bin / pip,但macOS Sierra没有提供。
sigjuice

1
在塞拉利昂工作
harryparkdotio

57

当pip尝试在El Capitan上为IPython安装手册页时,经常会出现此问题。快速解决方法是使用如下pip命令:

sudo -H pip install --install-option '--install-data=/usr/local' <package>

但是,El Capitan上的系统完整性保护(SIP)阻止了过去使用的pip的一些不良做法,因此您可能需要进行一些其他更改才能使pip在El Capitan上平稳运行。

El Capitan上的SIP在OS X上由Apple提供的Python版本中使用pip暴露了三个问题:

  1. distutils在Mac上未正确设置两个重要变量,因此pip尝试在下写入标头和其他共享文件(例如,联机帮助页)/System/Library/Frameworks/Python.framework/Versions/2.7/。这是一个坏主意,但在OS X的早期版本中,如果使用sudo运行pip,则成功。但是由于SIP,它在El Capitan上失败。这是您遇到的错误。它给像这样的消息OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple在其中安装了某些软件包的过时版本/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/(例如六个)。在OS X的早期版本中,当您安装需要其中一个更新版本的软件包时,sudo pip将以静默方式从/System/文件夹中删除该旧版本,并在中安装一个较新版本/Library/Python/2.7/site-packages。这也是一个坏主意,并且使用SIP不再可能。但是,现在尝试删除旧软件包时,pip将崩溃并显示错误消息。该消息也是OSError: [Errno: 1],但它是在类似的消息之后发出的Uninstalling six-1.4.1:。参见例如https://github.com/pypa/pip/issues/3165

  3. Apple版本的Python 在标准的用户可访问的软件包安装位置上方/System/Library/Frameworks/Python.framework/Versions/2.7/python搜索路径下添加了几个目录。因此,如果您在其他地方(例如)安装了较新版本的软件包,则会收到一条消息,表明安装成功,但是当您运行python时,您会从那里获得较旧的版本。这也使得不可能使用与标准库中的模块同名的新软件包。sudo -H pip install --ignore-installed six/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/

您可以解决这些问题,但是方法取决于您对三个问题的回答。

  1. 您要继续使用Mac OS X版本的Python还是安装自己的Python?自己安装是最安全的选择,可以通过官方的Python安装程序Homebrew或Anaconda完成。正如@Sacrilicious指出的那样,这也是Apple的建议。如果您安装自己的Python版本,则可能应该卸载当前已安装的所有软件包以及为这些软件包(包括pip)安装的所有脚本。否则,您将有一些脚本访问系统安装版本的Python和某些脚本访问自己的安装的烦人经历。/Library/Python/2.7/site-packages/usr/local/bin

如果您要坚持使用系统安装的Python,则必须再做出两个决定:

  1. 您要为所有用户安装软件包,还是仅为您自己安装软件包?为所有用户安装将确保使用Python的每个程序(可能包括管理脚本)都可以访问您安装的所有软件包。但是,它极有可能干扰El C​​apitan自己使用Python。(我希望Apple python -S可以确保始终获得他们期望的软件包,但是我没有办法对其进行测试。)仅为您自己的用户帐户进行安装,消除了干扰系统Python安装的可能性。注意:如果您打算从系统范围的安装切换到仅用户使用,则可能应该借此机会卸载中当前安装的内容/Library/Python/2.7/site-packages以及中的相关脚本/usr/local/bin

  2. 您是要隐藏OS X版本的Python(在下方/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/安装的额外软件包,还是将其保留在搜索路径中?我建议隐藏它们,以便在需要时将这些软件包的最新版本自动安装在用户可访问的位置。如果不隐藏此目录,则有时会收到消息,提示pip无法删除现有软件包以将其升级到更高版本(您正在安装的其他软件包需要)。在这种情况下,您将需要运行pip install --ignore-installed <package>,它将安装较新的版本并隐藏系统安装的版本。但是,如果您隐藏整个/System/.../Extras/...目录中,您将无法访问某些无法通过pip获得的Apple程序包,例如CoreGraphics和bonjour。(如果需要这些,可以通过将它们符号链接到site-packages目录中来进行访问。)

现在,这里是解决方法。在所有版本的OS X上,这些做法都是很好的做法,以避免意外替换或删除操作系统使用的Python软件包;但是,如果要在OS X El Capitan(10.11)上将用户安装的软件包与Apple提供的Python版本一起使用,则它们是必不可少的。

安装点子

您可能已经这样做了,但是如果没有,您可以使用以下命令为所有用户安装pip :

sudo -H easy_install pip
# pip script will be installed in /usr/local/bin

或使用此命令仅为您自己的用户帐户安装pip :

easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin

管理共享文件位置

如果要为所有用户安装软件包,请使用以下几行创建一个名为.pydistutils.cfg的文件(来自https://github.com/pypa/pip/issues/426):

[install]
install-data=/usr/local
install-headers=/usr/local

如果通常使用sudo -H pip ...,则应将此文件放在/var/root(root用户的主目录)中。如果通常使用sudo pip ...,则应将此文件放在自己的主目录(〜)中。

这些设置将防止pip尝试在下方编写共享项,例如标题和联机帮助页/Library/System。(此答案顶部的命令是同一内容的更快版本。)需要这些设置,因为darwin专用代码 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py无法将这些变量设置为可根写的位置(尽管它正确设置了其他变量)。有关更多信息,请参见https://github.com/pypa/pip/issues/3177

如果仅为您自己的用户帐户安装软件包,则共享项将自动安装在下~/Library/Python/2.7/。但是您应该将以下行添加到〜/ .profile中,以便在需要时可以找到共享项:

export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH

注意:您将需要启动新的Shell或在命令行上运行这些命令,以使更改生效。hash -r如果您最近从路径中删除了旧脚本,则可能还需要运行。

管理Python路径

您将需要确保安装的软件包在Python的搜索顺序中高于系统安装的软件包。最简单的方法是使用.pth文件。这遵循@Sacrilicious 在此页上其他地方的建议,但要确保在系统级site-packages目录之前搜索用户site-packages目录,并且在标准库和Apple的Extras目录(都在/ System /下)之前搜索这两个目录。 ..)。/System/.../Extras如果需要,它也将从搜索路径中省略。

fix_mac_path.pth使用下面的文本创建一个名为的文件。如果要为所有用户安装软件包, fix_mac_path.pth则应放在中/Library/Python/2.7/site-packages如果您只为自己的用户安装, fix_mac_path.pth则应位于〜/ Library / Python / 2.7 / lib / python / site-packages中。(此文件可以具有您想要的任何名称,但是必须将其放置在这两个位置之一或两者中,并且必须以.pth; 结尾;而且,该文件中的所有文本都必须在一行上。)

如果要在以下位置隐藏Apple安装的软件包/System/.../Extras

首先运行以下命令之一,以获得独立于Apple提供的版本的pip / setuptools的工作副本:

pip install --ignore-installed --user setuptools   # your account only
# or
sudo -H pip install --ignore-installed setuptools  # all users

然后将以下代码放在fix_mac_path.pth上面指定的位置:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

如果要继续使用Apple安装的软件包,则无需安装其他setuptools副本。只需将以下代码放在fix_mac_path.pth上面指定的位置:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

此后,您可以python -m site用来确保路径搜索顺序有意义。

安装套件

之后,您应该能够使用以下命令之一安装新软件包。

对于所有用户:

sudo -H pip install <package>

对于您自己的用户:

pip install --user <package>

明确说明了其他选择的方向。我遵循了本指南,并成功解决了“六个”库问题,从而允许我安装mitmproxy。
Paul Chernoch

1
这确实是我在stackoverflow上遇到过的最有用,最完整和最有用的答案之一。干得好,谢谢。
cmsjr

@cmsjr,谢谢!我花了一段时间才弄清楚发生了什么,这给了我一个很好的参考位置!
马提亚斯·弗里普

4
到目前为止,我已经看到了关于该领域的最清晰,最完整的解释,特别是对现有系统Python混乱的清理-谢谢!我的主要改进是强烈建议您使用冲煮安装的Python,因为这非常容易,并且提供了不需要sudo的干净设置。这是用于开发项目的virtualenv的补充。
RichVel

这悲剧。上帝祝福你。
马特M.17年

31

首先,您不会禁用SIP作为解决此问题的方法。抱歉,这是该文件夹创建失败的原因,但是我们必须解决该问题。其次,当您安装自己的Python时,您会失去Apple认为它们给您的所有好处,就像通过pyObjC的桥梁一样。
(我承认,如果您是开发人员,他们会说您应该安装自己的工具/usr/local,我只是反对用brew 的简单方法来安装它。)

从逻辑上讲,您应该将其安装在SIP不会阻止您的位置,并且几乎可以肯定这是一些依赖点为您解决的。告诉pip您希望它在哪里执行安装不是解决办法,而是让它忽略/ System中预先存在的内容,这是它会在其中检查许多需要的常见安装(例如six和SIP)的依赖性的地方。尝试升级时会自行中断。这实际上是pip的默认行为,即安装到/Library/Python/2.7/site-packages,您只需要说一句就--ignore-installed可以强制它在其中安装任何更新的依赖项版本。
...不幸的是,您然后可能会在交互式会话或脚本中导入该模块,并遇到很多失败-它仍在查看/ System的未升级包!

自从早期的setuptools时代起,Python就有一种使查询变得明确的方法。它看起来有些奇怪,(并且应该引起我们这些对安全意识敏锐的人的关注,他们对在不进行检查的情况下将其推到列表顶部的直率感到不高兴,但是)您可以放置​​一个以.pth(例如'elcap.pth')进入/Library/Python/2.7/site-packages,将目录推入查找顺序的最前面,其中包含以下内容:
import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

开始一个新的会话,然后快速旅行以python -m site确认您已将该路径插入第一个插槽,并且导入模块应该可以工作。

噢,毕竟,尝试使用pip --user选项进行安装,或者使用virtualenv-无论如何,这对大多数人来说都是最佳实践。


1
现在,这很优雅,并且与我简单的“放弃系统Python并酿造”解决方案很好地对立。如果您需要快速又肮脏的代码,这可能不值得,但是保留pyObjC和一个python具有很大的优点。
bmike

2
更pythonic和更明智的做法是安装为--uservirtualenv或使用virtualenv。作为系统管理员,我只是想为系统安装一次,并且用户应该能够覆盖系统。此解决方案的异议可能是系统将查看更改的路径,但是有先例easy_install也可以写入.pth文件。
2015年

2
我不知道冲泡方式是否是简单/错误的方式-解决问题的方法,而冲泡正在以惊人的方式解决我的问题-独自思考使用新玩具需要付出多少努力(红宝石2.2 .3,python3.5,MongoDB,Node4.2.1),就像键入命令一样,它可以重新编译,更新并消除异常-嗯,所以我走了简单的路:)我不知道这是什么除了Cocoa和Threads支持以及许多我以前从未使用过的软件包之外,已发行的OS X版本的Python是如此不同,我确实编译了我的Xcode /内核堆
PJJ 2015年

我将elcap.pth添加到/Library/Python/2.7/site-packages中,现在我看到该路径在sys.path的0和2索引处列出。然后,我尝试sudo pip install --ignore-installed ipython并运行,直到“正在运行pexpect的setup.py安装”为止,此时pip 仍会尝试升级/System/Library/Frameworks/Python.framework/Versions/2.7/share中的某些内容,并且会出错。
kojiro

安装virtualenv需要使用pip,因此并不能真正解决与pip使用相关的任何问题。实际上,我正在使用它进行安装,pip --user而virtualenv仍然无法正常工作。
user5359531

4

我认为这是因为SIP系统完整性保护,一种实时文件保护,感觉像Windows防病毒软件:)并停止了您想在OS X系统文件夹中进行的任何更改。苹果公司只是决定禁用系统修改功能–确保您完全免受互联网和其他与计算机相关的邪恶力量的侵害,SIP可以保护我们免受侵害

如果要禁用SIP,则需要在启动Mac的同时按住Command + R键来启动到Recovery HD 。

从“实用工具”菜单中打开终端csrutil disable,然后输入,然后按回车键。转到Apple菜单重新启动。

从现在开始将禁用SIP。我很久以前禁用它,没有发现任何错误,某些进程似乎在抱怨,但是它们始终在OS X上运行,所以我不确定这是否是由于缺少系统完整性“保护”引起的

我的提示是完全摆脱SIP和/或将自制软件用于您的所有开源/开发软件。Homebrew在安装时使用/ usr / local目录,并且不会与其他系统组件发生冲突,并且homebrew构建比os x apple构建更新。


1
否决这个答案是没有道理的。但是,也许有人只是胡思乱想?从我+1 ...
bmike

1
谢了哥们!试图发表一些幽默,但并不是每个人都必须与我的理解保持一致;)
PJJ 2015年

嗯-看完正确的答案后,我不太确定这是SIP。有什么想法吗?
bmike

1
实际上,这是SIP阻止了将文件夹(可能是手册页之类的文件夹)创建为/System; 的子目录。自10.11起禁止进入。如果遇到紧急情况,我们可以使用csrutil暂时禁用它,尽管我知道这可能会使它变成w鼠,但这似乎并不是使用它的好理由。离开它是……为什么我们不能拥有美好的事物。
2015年

我一直都把它关掉:statusSystem Integrity Protection status: enabled (Custom Configuration). Configuration: Apple Internal: disabled Kext Signing: disabled Filesystem Protections: disabled Debugging Restrictions: disabled DTrace Restrictions: disabled NVRAM Protections: disabled 而且没有理由启用它,因为我的系统已经非常紧密地关闭和定制了
PJJ 2015年

4

使用pip3 install <package>替代和解决了权限问题pip


4

相信我,您真的不希望该库在该路径上编写任何内容。

以前不建议使用,但可以写入/System/Library/Frameworks/Python.framework/Versions/2.7/,但是由于Apple SIP的缘故,现在不支持它,因此是库所有者的问题。程序包分发应该升级,以便与此更新一起正常工作。大多数软件包已更新并将其内容安装到/Library/Python/2.7/site-packages,但某些软件包未更新。

就我而言,这是greenlet库试图将其.h文件写入System Frameworks文件夹:

如何解决: sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/" 然后sudo -H pip install gevent

对于numpy,解决方法是sudo -H pip install --ignore-installed -U numpy

对于其他库,修补程序的范围从https://github.com/pypa/pip/issues/3177pip install --ignore-installed sixpip install --user(最后一个将所有内容都安装到/User//Library/Python/2.7/路径)中。另请参阅此帖子的当前最佳答案:https : //apple.stackexchange.com/a/210021/169157

如果键入python -m site,则应sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] 在系统路径之前包含 -这就是它(和如何)起作用的原因。


3

我这样做如下:

brew install python

然后在安装python之后:

sudo easy_install pip

3
brew install python已经安装了点子。如果然后通过easy_install安装pip,则可能会完成两次pip安装,这可能会导致令人困惑的问题。
NSSynapse '16

3

解决此问题的一个很酷的解决方案是使用virtualenv(virtualenvwrapper),在为项目创建新环境后,可以使用pip而不出现问题,因此我使用了virtualenvwrapper,这两行代码解决了该问题:

mkproject <project_name>
pip install <package_name>

您如何建议安装virtualenv?pip install virtualenv或点子不起作用,并且您需要sudo easy_install针对此处的内容诉诸+1。干杯
bmike

1
pip无法正常工作,因为权限问题,所以sudo easy_install可以工作
neosergio

2

我的Mac上安装了python3,而OSX随附了原始的python2.7。因此,每当我想调用python3时,我只需键入$ python3...。也许您应该尝试$ python3 get-pip.py,当我遇到几乎相同的问题时,这对我有用。


2

摘要

我在Mac OS X 10.11.6(具有SIP)上遇到了此问题,因为我使用System easy_install安装了pip,而本地easy-install.pth则引用了系统库。
使用pip安装后续软件包时,某些依赖项已解析为较旧的System Python库。
解决方案是删除我本地安装的库,然后从https://www.python.org/downloads/重新安装本地python版本(包括pip),以使系统和本地安装的python实例保持独立。
我曾尝试在@mfripp的答案中使用fix_mac_path.pth修复程序,但是发现删除并重新安装了清洁程序。

原因

(不要执行以下步骤)

我在尝试安装Ansible时遇到了这个问题。我遵循Ansible docs通过pip在OS X上进行安装,
首先我sudo easy_install pip
使用/usr/bin/easy_installpip安装了pip。在安装pip时使用System easy_install在安装pip时/Library/Python/2.7/site-packages/pip
收到了如下警告,但我忽略了它们并盲目地将其犁开。

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
warning: no previously-included files found matching '.coveragerc'
...
Adding pip 9.0.1 to easy-install.pth file
Installing pip script to /usr/local/bin
...
Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg
...
Finished processing dependencies for pip

/Library/Python/2.7/site-packages/easy-install.pth来看,看起来像这样

import sys; sys.__plen = len(sys.path)
./pip-9.0.1-py2.7.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

然后我通过pip安装了ansible

sudo pip install ansible

我收到消息说系统库已经满足要求

Requirement already satisfied: setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from ansible)  
Requirement already satisfied: six>=1.4.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from cryptography>=1.1->paramiko->ansible)

然后在运行ansible时遇到了这个问题

VersionConflict: (setuptools 1.1.6 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python), Requirement.parse('setuptools>=11.3'))

一个点子检查显示paramiko需要更新的setuptools

pip check paramiko
matplotlib 1.3.1 requires tornado, which is not installed.
matplotlib 1.3.1 requires nose, which is not installed.
cryptography 1.7.2 has requirement setuptools>=11.3, but you have setuptools 1.1.6.

注意,只有ansible才需要setuptools(无版本),因此pip报告了System setuptools满足的依赖性。

我通过使用https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython中提示的过程卸载任何本地python库来解决
此问题

sudo rm -rf /Library/Python

然后我删除了/ usr / local / bin中的符号链接和可执行文件,例如

sudo rm /usr/local/bin/ansible  # executable
sudo rm /usr/local/bin/python*  # symlinks to /Library/Python/2.7
sudo rm /usr/local/bin/easy_install*

等等。我还删除了所有应用程序

sudo rm -rf /Applications/Python\ 2.7/

然后,我从https://www.python.org/downloads/下载了适用于Mac OS X的2.7.13安装程序包, 并进行了安装。

这在/Library/Frameworks/Python.framework/Versions/2.7和符号链接处安装了本地python和pip,/usr/local/bin其中与系统库分开/System/Library/Frameworks/Python.framework/usr/bin 所以我得到了

which pip
/Library/Frameworks/Python.framework/Versions/2.7/bin/pip
which ansible
/Library/Frameworks/Python.framework/Versions/2.7/bin/ansible

和在 pip list

setuptools (28.8.0)
six (1.10.0)

ansible现在为我工作


1

对我来说,PATH缺少了pip,这已通过运行得到确认python -m pip

这里有两个可能的解决方案,加pip回到PATH。就我而言,无论如何pip都已经过时了,所以升级修复了它:

python -m pip install --upgrade pip

✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.