在OSX El Capitan上升级setuptools


81

我正在尝试升级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

我该如何解决?


2
我没有解决方案,但有一个解释:可能是由于新的系统完整性保护。pip尝试修改不允许的内容,即使使用也不行sudo。看到这个问题。我还没有花时间来解决这个问题。--user点子的选择可能就是我要研究的。如果您找到“更新”所有内容的实用解决方案,请分享!
亚瑟

我收到ipdb与关联的错误setuptools。升级setuptools不起作用。它可以使用,--user=python但仍不能修复ipdb错误。
R11G

Answers:


189

发生这种情况是由于OS X El Capitan中引入了系统完整性保护。

添加--user python到命令允许此工作。

换一种说法

pip install --upgrade setuptools --user python

2
pip(不同于easy_install)不需要sudo,因为您要让它使用pythonuser,所以我确保它可以工作。
Kof

1
也可以在Docker容器内的CentOS 7上运行。由于某种原因而失败(尽管在2016年5月之前没有执行此步骤,但完全相同的设置也可以工作...)
geerlingguy

2
我无法使其正常工作,而且我不了解--user选项应该如何工作。对我有用的是在升级setuptools(与安装ipython结合使用)时暂时禁用System Integrity Protection,然后再重新启用它。为此:启动进入恢复模式(cmd + R),启动终端并输入csrutil disable。重新启动,升级后,重新启动到恢复模式并输入csrutil enable。重新启动后,ipython对我来说仍然可以正常工作。
2016年

我可以成功执行此命令,但是没有进行任何更新。输出看起来像这样:Collecting setuptools Using cached setuptools-28.2.0-py2.py3-none-any.whl Requirement already up-to-date: python in /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload Installing collected packages: setuptools Successfully installed setuptools-1.1.6
diidu

我终于能够按照这里给出的说明进行操作:apple.stackexchange.com/questions/209572/…–
diidu

2

总览

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

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

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

细节

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

当我按照Mac OS的ansible安装说明进行操作时,我的问题就开始了,这是通过pip进行安装并以pip的最新发行版中easy_install所述的方式安装pip

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

随后安装ansible with,pip install ansible然后报告Mac OS满足setuptools的要求,前提是Ansible的Python库/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
需要setuptools但未指定版本。另一个从属软件包paramiko,需要setuptools> = 11.3,但是通过pip安装ansible时似乎没有对此进行检查。当您尝试运行ansible时,尽管它抱怨安装工具是1.1.6,这是Mac OS随附的setuptools的版本,现在受SIP保护,因此无法升级。

我没有禁用SIP,而是通过按照https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython上的提示卸载本地Python来解决此问题 ,然后再次下载并安装。

如果您担心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安装程序包, 并进行了安装。

这种安装在本地Python和点子/Library/Frameworks/Python.framework/Versions/2.7,并在符号连接/usr/local/bin,以及预先考虑/Library/Frameworks/Python.framework/Versions/2.7到我的$ PATH。这使所有内容都与Mac OS提供的库分开/System/Library/Frameworks/Python.framework/usr/bin 因此我得到了

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

然后我安装ansible以pip install ansible
后来,当我跑which ansible我得到

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

和在 pip list

setuptools (28.8.0)
six (1.10.0)

并且ansible现在对我有用,因为新安装未引用Mac OS Python库。

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


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。

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.