Обновление инструментов настройки в OSX El Capitan

81

Я пытаюсь обновить инструменты настройки. Ну, на самом деле я пытаюсь обновить доступ, но он пытается обновить инструменты установки и терпит неудачу. Попытка сделать это самому тоже не удалась. Даже попытка удалить его не удалась

$ 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

Как я могу это исправить?

gman
источник
2
У меня нет решения, но есть объяснение: вероятно, это из-за новой защиты целостности системы . pip пытается изменить то, что больше не разрешено, даже с sudo. См. Этот вопрос . Я еще не нашел времени заниматься этим. --userВозможность пип, вероятно , что я бы смотреть. Если найдете практическое решение "обновить" все, поделитесь пожалуйста!
Артур,
Я получаю ipdbошибку, связанную с setuptools. Обновление средств настройки не работает. Он работает, --user=pythonно до сих пор не исправляет ошибку ipdb.
R11G

Ответы:

189

Это происходит из-за защиты целостности системы, представленной в OS X El Capitan.

Добавление --user pythonв команду позволило этому сработать.

Другими словами

pip install --upgrade setuptools --user python
Kof
источник
2
pip(в отличие от easy_install) не требует sudo, поскольку вы позволяете ему использовать pythonпользователя, я убедился, что он работает.
Kof
1
Также работает на CentOS 7 внутри контейнера Docker. По какой-то причине не работал (хотя точно такая же установка работала без этого шага до мая 2016 года ...)
geerlingguy
2
Мне не удалось заставить его работать, и я не понимаю, как должна работать опция --user. Что сработало для меня, так это временное отключение защиты целостности системы при обновлении инструментов настройки (в связи с установкой ipython) и последующее ее повторное включение. Для этого: загрузитесь в режим восстановления (cmd + R), запустите терминал и войдите csrutil disable. Перезагрузитесь, а после обновления перезагрузитесь в режим восстановления и войдите csrutil enable. После перезагрузки у меня ipython продолжал нормально работать.
Grav
Я могу успешно выполнить эту команду, но обновление не производится. Результат выглядит так: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 05
Я наконец смог заставить все работать, следуя приведенным здесь инструкциям: apple.stackexchange.com/questions/209572/…
diidu 01
2

Обзор

Проблема заключается в конфликте библиотек Python в сочетании с системой защиты целостности системы (SIP) в Mac OS, которая защищает системные библиотеки Python.

На мой взгляд, лучшим решением является удаление и повторная установка вашей собственной установки Python и сохранение ее отдельно от библиотек Python, предоставляемых Mac OS, которые защищены SIP.

Я предпочитаю отключать SIP, так как ожидаю, что SIP будет частью любых будущих выпусков Mac OS, и SIP здесь не является причиной, он просто обнажает проблему конфликта библиотек Python.

Детали

У меня также была эта проблема при установке ansible.

Моя проблема началась, когда я выполнил инструкции по установке ansible для Mac OS, которые заключаются в установке через 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и этот файл ссылается на библиотеки Python, предоставленные Mac OS.

Последующая установка ansible с pip install ansibleзатем сообщает, что требование setuptools удовлетворяется Mac OS, предоставленной библиотекой Python в /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible, требует setuptools, но не указывает версию. Другой зависимый пакет, paramiko, требует setuptools> = 11.3, но, похоже, это не проверяется при установке ansible через pip. Когда вы пытаетесь запустить ansible, он жалуется, что инструменты установки 1.1.6. Это версия setuptools, поставляемая с Mac OS, и теперь она защищена 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

Затем я загрузил установочный пакет 2.7.13 для Mac OS X с https://www.python.org/downloads/ и установил его.

Это установило локальный python и pip at /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
Then, когда я запускаю, which ansibleя получаю

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

И в pip list

setuptools (28.8.0)
six (1.10.0)

и ansible теперь работает для меня, потому что библиотеки Python Mac OS не упоминаются при новой установке.

Обратите внимание, что из-за того, что установщик установил $ PATH, which pythonтеперь /Library/Frameworks/Python.framework/Versions/2.7/bin/pythonи /usr/local/bin/pythonявляется символической ссылкой на него.
Если вам нужен системный Python, вам придется использовать / usr / bin / python или изменить $ PATH

Джейсон С
источник
1

Ответ заключается в том, что вы не можете обновить setuptools в OSX для заводского питона, поставляемого с ОС. Причина в том, что файлы /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonне могут быть удалены или изменены пользователем. Не только обычный пользователь, но даже если у вас есть права root, вы не сможете изменять эти файлы.

Конечно, вы можете использовать различные другие методы для установки более новой версии setuptools, но это не переопределит системный пакет по умолчанию. Это означает, что если вы пойдете по предложенному маршруту использования --user pythonфлага или решите установить их без root ~/Library, они не переопределят версию системных файлов.

Причина, по которой вы или root не можете изменить системные настройки по умолчанию, связана с ограничениями разрешений SIP в El Capitan +. Вы можете отключить SIP, но обычно это не рекомендуется.

Вместо этого единственное разумное решение - использовать python virtualenv.

IK
источник