当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暴露了三个问题:
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'
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。
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/
您可以解决这些问题,但是方法取决于您对三个问题的回答。
- 您要继续使用Mac OS X版本的Python还是安装自己的Python?自己安装是最安全的选择,可以通过官方的Python安装程序Homebrew或Anaconda完成。正如@Sacrilicious指出的那样,这也是Apple的建议。如果您安装自己的Python版本,则可能应该卸载当前已安装的所有软件包以及为这些软件包(包括pip)安装的所有脚本。否则,您将有一些脚本访问系统安装版本的Python和某些脚本访问自己的安装的烦人经历。
/Library/Python/2.7/site-packages
/usr/local/bin
如果您要坚持使用系统安装的Python,则必须再做出两个决定:
您要为所有用户安装软件包,还是仅为您自己安装软件包?为所有用户安装将确保使用Python的每个程序(可能包括管理脚本)都可以访问您安装的所有软件包。但是,它极有可能干扰El Capitan自己使用Python。(我希望Apple python -S
可以确保始终获得他们期望的软件包,但是我没有办法对其进行测试。)仅为您自己的用户帐户进行安装,消除了干扰系统Python安装的可能性。注意:如果您打算从系统范围的安装切换到仅用户使用,则可能应该借此机会卸载中当前安装的内容/Library/Python/2.7/site-packages
以及中的相关脚本/usr/local/bin
。
您是要隐藏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>