在OSX El Capitan上升级setuptools

时间:2015-10-20 10:50:23

标签: macos python-2.7 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

所有

我该如何解决?

3 个答案:

答案 0 :(得分:186)

这是因为OS X El Capitan中引入了系统完整性保护。

在命令中添加--user python可以使其正常工作。

换句话说

pip install --upgrade setuptools --user python

答案 1 :(得分:2)

概述

问题在于Python库存在冲突,并且与Mac OS上的系统完整性保护(SIP)相结合,可以保护系统Python库。

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

我倾向于禁用SIP,因为我希望SIP成为未来任何Mac OS版本的一部分而SIP不是这里的原因,它只是暴露了冲突的Python库的问题。

详细

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

当我按照Mac OS的ansible安装说明进行操作时,我的问题就出现了,这是通过pip安装并使用easy_install安装pip,如Latest Releases Via Pip所述

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

随后使用/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python安装ansible,然后在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 处报告Mac OS提供的Python库满足setuptools要求 Ansible需要setuptools但不指定版本。另一个依赖包,paramiko,需要setuptools> = 11.3,但在通过pip安装ansible时似乎没有检查过。当你试图运行ansible虽然它抱怨安装工具是1.1.6这是随Mac OS提供的setuptools版本,现在受SIP保护,所以它无法升级。

我没有禁用SIP,而是通过卸载我的本地Python来修复此问题,如https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython所暗示的那样。 然后再次下载和安装。

如果你关心rm,你可以用mv代替 要卸载我做了

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

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

这在/usr/local/bin安装了一个本地python和pip,在/Library/Frameworks/Python.framework/Versions/2.7安装了符号链接,并在我的$ PATH中添加了/System/Library/Frameworks/Python.framework。这使得所有内容与/usr/binwhich pip /Library/Frameworks/Python.framework/Versions/2.7/bin/pip 上的Mac OS提供的库分开 所以我得到了

pip install ansible

然后我用which ansible安装了ansible 然后,当我运行/Library/Frameworks/Python.framework/Versions/2.7/bin/ansible 时,我得到了

pip list

并在setuptools (28.8.0) six (1.10.0)

which python

和ansible现在适用于我,因为新安装没有引用Mac OS Python库。

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

答案 2 :(得分:1)

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

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

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

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