升级OSX El Capitan上的setuptools

我正在尝试升级setuptools。 其实我正在尝试升级ansible,但它正在尝试升级setuptools和失败。 试图自己做也失败了。 即使试图卸载它失败

$ sudo -H pip install --upgrade setuptools Collecting setuptools Using cached setuptools-18.4-py2.py3-none-any.whl Installing collected packages: setuptools Found existing installation: setuptools 1.1.6 Uninstalling setuptools-1.1.6: Exception: Traceback (most recent call last): File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/basecommand.py", line 211, in main status = self.run(options, args) File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/commands/install.py", line 311, in run root=options.root_path, File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_set.py", line 640, in install requirement.uninstall(auto_confirm=True) File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_install.py", line 716, in uninstall paths_to_remove.remove(auto_confirm) File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_uninstall.py", line 125, in remove renames(path, new_path) File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/utils/__init__.py", line 315, in renames shutil.move(old, new) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 299, in move copytree(src, real_dst, symlinks=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree raise Error, errors Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib'")] 

我不知道什么是错的。 查看/System/Library/Frameworks/Python.framework/Versions/2.7/及以下的所有文件,每个文件都由root:wheel

我该如何解决?

这是由于OS X El Capitan中引入的系统完整性保护。

添加 – 用户--user python的命令允许这个工作。

换一种说法

 pip install --upgrade setuptools --user python 

答案是,你不能更新OSX上的工厂python的setuptools。 原因是/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python中的文件不能被用户删除或修改。 不仅是普通用户,即使你有root权限,你也将无法修改这些文件。

当然,您可以使用其他各种方法来安装较新版本的setuptools,但这不会覆盖默认的系统软件包。 这意味着如果你使用了build议的使用方式--user python标志,或者你select在没有root的情况下把它们安装到~/Library ,它们将不会覆盖系统文件的版本。

您或root无法修改系统默认值的原因是由于El Capitan +中的SIP权限限制。 您可以禁用SIP,但通常不build议这样做。

相反,唯一合理的解决scheme是使用python virtualenv。

概观

问题在于Python库与系统完整性保护(SIP)在Mac OS上相结合,从而保护系统Python库。

我认为最好的解决scheme是卸载并重新安装自己的Python安装,并将其与由受OS保护的Mac OS提供的Python库分开。

我赞成这样做,因为我希望SIP成为未来Mac OS发行版的一部分,而SIP在这里并不是原因,只是暴露了Python库冲突的问题。

细节

我也有这个问题试图安装ansible。

当我按照Mac OS的安装说明进行操作时,我的问题就开始了,它是通过pip进行安装,并使用easy_install安装pip,如最新版本中所述

问题是这样安装pip时, easy_install是在/usr/bin/easy_install提供的easy_install上的Mac OS,但它写入/Library/Python/2.7/site-packages/easy-install.pth上的easy-install.pth文件/Library/Python/2.7/site-packages/easy-install.pth ,该文件引用了Mac OS提供的Python库。

随后安装ansible与pip install ansible然后报告setuptools的要求满足的Mac OS提供的Python库在/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python系统/库/ /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible需要setuptools,但不指定版本。 另一个依赖软件包paramiko需要setuptools> = 11.3,但是在安装通过pip安装时没有检查。 当您尝试运行安德鲁,虽然它抱怨设置工具是1.1.6这是Mac OS提供的setuptools的版本,现在由SIP保护,所以它不能升级。

我不是通过禁用SIP来解决这个问题,而是通过卸载我的本地Python,如https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython所示; ,然后再次下载和安装。

如果你关心RM,你可以改为MV
卸载我做了

 sudo rm -rf /Library/Python sudo rm -rf /Applications/Python\ 2.7/ 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* # and so on for references to /Library/Python/2.7 in /usr/local/bin 

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

这在/Library/Frameworks/Python.framework/Versions/2.7安装了一个本地python和pip,在/usr/local/bin安装了符号链接,以及将/Library/Frameworks/Python.framework/Versions/2.7添加到我的$ PATH。 这使得一切与Mac OS提供的库在/System/Library/Frameworks/Python.framework/usr/bin/System/Library/Frameworks/Python.framework ,这样我就可以得到

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

然后,我安装安装可靠的pip install ansible
然后当我运行我得到的

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

并在pip list

 setuptools (28.8.0) six (1.10.0) 

而且现在可以正常工作,因为Mac OS Python库没有被新安装引用。

请注意,由于安装程序设置$ PATH, which python现在是/Library/Frameworks/Python.framework/Versions/2.7/bin/python/usr/local/bin/python是符号链接。
如果你想要系统Python,你必须使用/ usr / bin / python或者改变$ PATH