Оновлення установочних програм на OSX El Capitan


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,

Відповіді:


189

Це відбувається завдяки системному захисту цілісності, введеному в OS X El Capitan.

Додавання --user pythonдо команди дозволило це спрацювати.

Іншими словами

pip install --upgrade setuptools --user python

2
pip(на відміну від easy_install) не вимагає sudo, оскільки ви дозволяєте йому використовувати pythonuser, я переконався, що він працює.
Коф

1
Також працює на CentOS 7 всередині контейнера Docker. Не вдалося з якихось причин (хоча точно така ж установка працювала без цього кроку до травня 2016 року ...)
geerlingguy

2
Я не міг змусити його працювати, і я не розумію, як повинен працювати параметр --user. Мені вдалося тимчасово вимкнути Захист цілісності системи під час оновлення setuptools (у зв’язку з установкою 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

Нарешті я зміг налагодити
diidu

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

Проблема при установці пипа цього шляху, то 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 з 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 на /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 для фабричного пітона, який постачається з ОС. Причина полягає в тому, що користувач /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonне може видалити чи змінити файли в . Не лише звичайний користувач, але навіть якщо у вас є права на root, ви не зможете змінювати ці файли.

Звичайно, ви можете використовувати різні інші методи для встановлення нової версії setuptools, але це не замінить системний пакет за замовчуванням. Це означає, що якщо ви пройдете запропонований шлях використання --user pythonпрапора або ви вирішите встановити їх без root ~/Library, вони не замінять версію системних файлів.

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

Натомість єдиним розумним рішенням є використання python virtualenv.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.