После обновления El Capitan я не могу запустить установку pip. Ошибка, которую я получаю, заключается в том, что «операция не разрешена», когда pip пытается создать новые папки во время установки.
creating /System/Library/Frameworks/Python.framework/Versions/2.7/share
error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
На самом деле, я не могу создавать папки и т.д. в этих папках. Попробовал использовать sudo, который не помогает. Также я сделал
sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/
Вышесказанное тоже не помогло. Что я могу сделать, чтобы снова установить библиотеки Python?
macos
el-capitan
permission
python
authorization
web_ninja
источник
источник
Ответы:
Быстрое решение - использовать homebrew для установки
python
в систему,/usr/local/bin
чтобы выpip
могли работать с изменяемой пользователем структурой python.Отключение защиты целостности системы также является вариантом, но я не рекомендую использовать его для каких-либо целей, кроме серверов с профессиональным управлением и защищенными стенами, где у вас есть рабочая сила для управления обнаружением вторжений, или если вы являетесь разработчиком / системным администратором и вам нужно что-то тестировать с и без ГЛОТОК.
Вы увидите, что установлен флаг с ограничениями, который нельзя удалить даже с правами суперпользователя, пока включен протокол SIP.
Использование homebrew позволяет управлять pip и python отдельно от версии, предоставленной системой. В качестве бонуса, доморощенный фреймворк предназначен для упрощения обслуживания и исправления / рутинных операций посредством автоматизации.
источник
brew install python
это самый простой вариант, хотя очистка некоторых других настроек может потребоваться, если вы уже некоторое время используете системный Python (например, файлы Python, принадлежащие пользователю root/usr/local/bin
и ниже~/Library/Caches/pip
)brew
так как легко прикрепить понравившуюся версию - управлять несколькими различными версиями или регулярно обновлять информацию. Но если у вас есть что-то, что работает для вас - трудно утверждать, что вы должны что-то изменить.Другой жизнеспособный вариант без необходимости отключать SIP или устанавливать другие версии Python - это устанавливать модули только для текущего пользователя, используя
Если это просто ваша личная машина, это будет самое простое и безопасное решение.
источник
Эта проблема часто возникает, когда pip пытается установить man-страницу для IPython на El Capitan. Быстрое решение состоит в том, чтобы использовать команду pip следующим образом:
Тем не менее, защита целостности системы (SIP) в El Capitan блокирует несколько недобросовестных действий с пипом, который использовался для перемещения, поэтому вам, вероятно, потребуется внести еще некоторые изменения, чтобы пип работал бесперебойно в El Capitan.
SIP на El Capitan раскрывает три проблемы с использованием pip с поставляемой Apple версией Python для OS X:
distutils неправильно устанавливает две важные переменные на Mac, поэтому pip пытается записать заголовки и другие общие файлы (например, manpages) в
/System/Library/Frameworks/Python.framework/Versions/2.7/
. Это плохая идея, но в более ранних версиях OS X она была успешной, если pip запускался с помощью sudo. Однако это не удается на El Capitan из-за SIP. Это ошибка, с которой вы столкнулись. Это дает сообщения какOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple устанавливает устаревшие версии некоторых пакетов
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(например, шесть). В предыдущих версиях OS X, когда вы устанавливали пакет, которому требовалась более новая версия одного из них,sudo pip
он автоматически удалял старую версию из/System/
папки и устанавливал более новую версию в/Library/Python/2.7/site-packages
. Это тоже была плохая идея, и с SIP это уже невозможно. Но теперь pip вылетит с сообщением об ошибке при попытке удалить старый пакет. Это сообщение такжеOSError: [Errno: 1]
, но оно приходит после сообщения, какUninstalling six-1.4.1:
. См., Например, https://github.com/pypa/pip/issues/3165 .Версия Python для Apple добавляет несколько каталогов
/System/Library/Frameworks/Python.framework/Versions/2.7/
в путь поиска python над стандартными доступными для пользователя местами установки пакетов. Поэтому, если вы устанавливаете более новую версию пакета в другом месте (например,sudo -H pip install --ignore-installed six
), вы получите сообщение о том, что установка прошла успешно, но затем, когда вы запустите Python, вы получите более старую версию/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Это также делает невозможным использование новых пакетов с тем же именем, что и у модулей из стандартной библиотеки.Вы можете обойти эти проблемы, но метод зависит от ваших ответов на три вопроса.
/Library/Python/2.7/site-packages
и все сценарии, которые были установлены/usr/local/bin
для этих пакетов (включая pip). В противном случае вы получите досадный опыт, когда некоторые скрипты обращаются к установленной системой версии Python, а некоторые - к вашей собственной установке.Если вы хотите придерживаться установленного на Python, вам нужно принять еще два решения:
Хотите установить пакеты для всех пользователей или только для себя? Установка для всех пользователей гарантирует, что каждая программа, которая использует Python (включая, возможно, административные сценарии), будет иметь доступ ко всем пакетам, которые вы устанавливаете. Тем не менее, существует небольшая вероятность того, что это повлияет на использование Python в El Capitan. (Я надеюсь, что Apple использует
python -S
их, чтобы всегда получать ожидаемые пакеты, но у меня нет возможности проверить это.) Установка только для вашей собственной учетной записи пользователя исключает возможность вмешательства в установку Python системы. Примечание: если вы собираетесь перейти от общесистемной установки к только пользовательской, вам, вероятно, следует воспользоваться этой возможностью, чтобы удалить все, что в настоящее время установлено в/Library/Python/2.7/site-packages
и связанные сценарии в/usr/local/bin
.Вы хотите скрыть дополнительные пакеты, которые установлены с версией Python для OS X (ниже
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
), или оставить их в пути поиска? Я рекомендую скрыть их, чтобы при необходимости новые версии этих пакетов автоматически устанавливались в доступных для пользователя местах. Если вы не скрываете этот каталог, вы иногда будете получать сообщения о том, что pip не смог удалить существующий пакет, чтобы обновить его до более поздней версии (необходимой для другого устанавливаемого вами пакета). В этом случае вам нужно будет запустить программуpip install --ignore-installed <package>
, которая установит более новую версию и скроет версию, установленную системой. Однако, если вы прячете весь/System/.../Extras/...
каталог, вы потеряете доступ к некоторым пакетам Apple, которые не доступны через pip, например CoreGraphics и Bonjour. (Если вам это нужно, вы можете получить доступ, вставив ссылки в каталог site-packages.)Теперь вот обходные пути. Это было бы хорошей практикой во всех версиях OS X, чтобы избежать случайной замены или удаления пакетов Python, используемых операционной системой; однако они необходимы, если вы хотите использовать установленные пользователем пакеты с поставляемой Apple версией Python для OS X El Capitan (10.11).
Установить пункт
Возможно, вы уже сделали это, но если нет, вы можете использовать следующую команду для установки pip для всех пользователей :
Или используйте эту команду, чтобы установить pip только для своей учетной записи :
Управление расположениями общих файлов
Если вы устанавливаете пакеты для всех пользователей, создайте файл с именем .pydistutils.cfg с этими строками (из https://github.com/pypa/pip/issues/426 ):
Если вы обычно используете
sudo -H pip ...
, то вы должны поместить этот файл в/var/root
(домашний каталог для пользователя root). Если вы обычно используетеsudo pip ...
, то вы должны поместить этот файл в свой домашний каталог (~).Эти настройки не позволят pip писать общие элементы, такие как заголовки и страницы руководства
/Library/System
. (Команда в верхней части этого ответа - более быстрая версия того же самого.) Эти настройки необходимы, потому что специфический для Дарвина код/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
не может установить эти переменные в корневые записи (хотя он устанавливает другие переменные правильно). Более подробную информацию об этом можно найти по адресу https://github.com/pypa/pip/issues/3177 .Если вы устанавливаете пакеты только для своей учетной записи, общие элементы будут автоматически установлены в
~/Library/Python/2.7/
. Но вы должны добавить следующие строки в ваш ~ / .profile, чтобы общие элементы находились тогда, когда они вам нужны:Примечание: вам нужно будет запустить новую оболочку или запустить ее в командной строке, чтобы изменения вступили в силу. Вы также можете запустить,
hash -r
если вы недавно удалили старые сценарии из пути.Управление Python Path
Вам нужно будет убедиться, что устанавливаемые вами пакеты выше в порядке поиска Python, чем установленные системой пакеты. Самый простой способ сделать это с помощью
.pth
файлов. Это следует предложению @ Sacrilicious в другом месте на этой странице , но гарантирует, что ваш каталог пользовательских пакетов сайта ищется перед вашим общесистемным каталогом пакетов сайта, и оба они ищутся перед стандартной библиотекой и каталогом Extras Apple (оба находятся в / System /. ..). При/System/.../Extras
желании он также исключается из пути поиска.Создайте файл с именем
fix_mac_path.pth
, с текстом ниже. Если вы устанавливаете пакеты для всех пользователей,fix_mac_path.pth
их следует разместить в/Library/Python/2.7/site-packages
. Если вы устанавливаете только для своего пользователя, этоfix_mac_path.pth
должно быть в ~ / Library / Python / 2.7 / lib / python / site-packages. (Этот файл может иметь любое имя, которое вы хотите, но он должен быть помещен в одно или оба из этих мест, и он должен заканчиваться.pth
; также весь текст в этом файле должен быть в одной строке.)Если вы хотите скрыть установленные Apple пакеты в
/System/.../Extras
:Сначала выполните одну из следующих команд, чтобы получить рабочую копию pip / setuptools независимо от версии, поставляемой Apple:
Затем поместите следующий код в
fix_mac_path.pth
указанное выше место:Если вы хотите продолжать использовать установленные Apple пакеты, вам не нужно устанавливать еще одну копию setuptools. Просто вставьте следующий код в
fix_mac_path.pth
указанное выше место:После этого вы можете
python -m site
убедиться, что порядок поиска путей имеет смысл.Установить пакеты
После этого вы сможете установить новые пакеты с помощью одной из следующих команд.
Для всех пользователей:
Для вашего собственного пользователя:
источник
Во-первых, вы не отключаете SIP как способ решения проблемы. Извините, что причина этого создания папки не удалась, но мы должны обойти это. Во-вторых, вы теряете все тонкости, которые, как думала Apple, они вам давали, как мост через pyObjC, когда вы устанавливаете свой собственный Python.
(Я признаю, они говорят, что
/usr/local
если вы разработчик, вам нужно установить свой собственный , я просто возражаю против того, чтобы сделать это простым способом с brew.)По логике вещей, вы могли бы подумать о том, чтобы установить его где-то, где SIP не блокирует вас, и это почти наверняка решает какой-то пип зависимостей. Указание pip, где вы хотите, чтобы он выполнял установку, - это не столько средство защиты, сколько игнорирование ранее существовавшего содержимого в / System, где он будет проверять зависимости для многих распространенных установок, которые необходимы, например
six
, и SIP вызывает pip сломаться, когда он попытается обновить его. Это фактически поведение pip по умолчанию для установки в /Library/Python/2.7/site-packages, вам просто нужно сказать,--ignore-installed
чтобы заставить его устанавливать там любые обновленные версии зависимостей.... К сожалению, вы можете перейти к импорту этого модуля в интерактивном сеансе или скрипте и получить хорошие жирные ошибки - он все еще смотрит на необновленный пакет / System!
С ранних дней setuptools у Python есть способ сделать этот поиск явным. Это немного странно выглядит (и должно вызывать паузу у тех из нас, кто заботится о безопасности и не в восторге от резкого переноса его в верхнюю часть списка без проверки, но) вы можете поместить файл, который заканчивается на
.pth
( например, 'elcap.pth'),/Library/Python/2.7/site-packages
чтобы переместить этот каталог в начало порядка поиска со следующим содержимым:import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path
Начните новый сеанс, и быстрый переход к
python -m site
подтверждению того, что вы вставили этот путь в первый слот, и импорт модулей должен работать.Да, и после всего этого, попробуйте просто установить с
--user
опцией pip или использовать virtualenv - в любом случае, это лучший метод для большинства людей.источник
--user
или использовать virtualenv. Как системный администратор, я просто считаю, что вы устанавливаете один раз для системы и что пользователь должен иметь возможность переопределить систему. Возражения против этого решения могут заключаться в том, что система будет искать измененный путь, но есть прецедент, когда easy_install может также записать файл .pth.sudo pip install --ignore-installed ipython
и он работает до тех пор, пока не будет запущен файл «setup.py install for pexpect», после чего pip все еще пытается что-то обновить в /System/Library/Frameworks/Python.framework/Versions/2.7/share и не выдаст ошибки.pip --user
и virtualenv все еще не работает.Я думаю, что это из-за SIP или System Integrity Protection , своего рода защиты файлов в режиме реального времени, которая ощущается как антивирус Windows :) и останавливает любые изменения, которые вы хотите внести в системные папки OS X. Apple просто решила отключить модификации системы - чтобы быть уверенным, что вы полностью защищены от зла Интернета и других злых сил, связанных с компьютером, от которых нас защищает SIP .
Если вы хотите отключить SIP, вам нужно загрузиться в Recovery HD, одновременно удерживая клавиши Command + R при загрузке Mac.
Откройте терминал из меню «Утилиты» и введите
csrutil disable
, затем нажмите «Return». Зайдите в Apple Menu для перезагрузки.SIP будет отключен с этого момента. Я отключил его давным-давно и не заметил ничего плохого, некоторые процессы, кажется, жалуются, но они всегда работают в OS X, поэтому я не уверен, вызвано ли это отсутствием «защиты» целостности системы
Мой совет - полностью избавиться от SIP и / или использовать homebrew для всего вашего программного обеспечения с открытым исходным кодом / разработки. Homebrew использует каталог / usr / local для своей установки и не сталкивается с другими компонентами системы, а сборки homebrew более современны, чем сборки os x apple.
источник
/System
; запрещено по состоянию на 10.11. Мы можем использовать csrutil, чтобы временно отключить его, если мы на пределе, хотя я знаю, что может показаться, что он может превратиться в махинацию, но это не является хорошей причиной для его использования. Оставить это - вот почему ... у нас не может быть хороших вещей.statusSystem Integrity Protection status: enabled (Custom Configuration). Configuration: Apple Internal: disabled Kext Signing: disabled Filesystem Protections: disabled Debugging Restrictions: disabled DTrace Restrictions: disabled NVRAM Protections: disabled
и у меня нет причины его включать, поскольку я довольно плотно закрыл и настроил свою системуИспользовал
pip3 install <package>
вместо этого и решил проблему с разрешением вpip
.источник
Поверьте, вы не хотите, чтобы библиотека писала что-то по этому пути.
Раньше это не рекомендовалось, но в него можно было писать
/System/Library/Frameworks/Python.framework/Versions/2.7/
, но теперь оно не поддерживается из-за Apple SIP, поэтому это проблема владельца библиотеки. Дистрибутив пакета должен быть обновлен для корректной работы с этим обновлением. Большинство пакетов были обновлены и их содержимое установлено/Library/Python/2.7/site-packages
, но некоторые пакеты не были обновлены.В моем случае это была библиотека greenlet, пытающаяся записать свой
.h
файл в папку System Frameworks:Как это исправить:
sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/"
тогдаsudo -H pip install gevent
Для NumPy это исправление
sudo -H pip install --ignore-installed -U numpy
.Для других библиотек исправления варьируются от https://github.com/pypa/pip/issues/3177 до
pip install --ignore-installed six
иpip install --user
(последняя устанавливает все в /User//Library/Python/2.7/ путь). Смотрите также текущий топ ответ на этот пост: https://apple.stackexchange.com/a/210021/169157Если вы печатаете,
python -m site
он должен включатьsys.path = [ ... '/Library/Python/2.7/site-packages', ... ]
системные пути - вот почему (и как) это работает.источник
Я сделал это следующим образом:
затем после установки Python:
источник
brew install python
уже устанавливает pip вместе с ним. Если вы затем установите pip с помощью easy_install, вы, вероятно, получите две установки pip, которые могут привести к путанице.Очень классное решение этой проблемы - использование virtualenv (virtualenvwrapper), после создания новой среды для вашего проекта вы можете без проблем использовать pip, поэтому я использовал virtualenvwrapper, и эти две строки решили проблему:
источник
pip install virtualenv
или пункт не работает, и вам нужно прибегнуть кsudo easy_install
+1 для того, что уже здесь. Приветствияsudo easy_install
работаетУ меня установлен python3 на моем Mac, в то время как оригинальный python2.7 поставляется с OSX. Поэтому, когда я хочу вызвать python3, я просто набираю $ python3 .... Может быть, вам стоит попробовать $ python3 get-pip.py, это работает для меня, когда у меня почти такая же проблема с вами.
источник
Резюме
Я столкнулся с этой проблемой в Mac OS X 10.11.6 (которая имеет SIP), потому что я установил pip с помощью System easy_install, а локальный easy-install.pth ссылался на системные библиотеки.
При установке последующих пакетов с pip некоторые зависимости были разрешены в более старых библиотеках System Python.
Решение состояло в том, чтобы удалить мои локально установленные библиотеки и переустановить локальную версию Python (которая включает в себя pip) из https://www.python.org/downloads/, чтобы система и локально установленные экземпляры Python были разделены.
Я попытался использовать исправление fix_mac_path.pth в ответе @mfripp, однако обнаружил удаление и переустановку очистителя.
причина
(Не выполняйте эти шаги)
Я столкнулся с этой проблемой, пытаясь установить Ansible. Я следовал Ansible docs для установки на OS X через pip.
Сначала я установил pip с помощью.
sudo easy_install pip
Это использовало System easy_install at
/usr/bin/easy_install
и установил pip at./Library/Python/2.7/site-packages/pip
Я получил следующие предупреждения при установке pip, но я проигнорировал их и вслепую включил.
Позже посмотрев
/Library/Python/2.7/site-packages/easy-install.pth
, это выглядело такЗатем я установил ansible через pip
Я получил сообщения о том, что системные требования уже выполнены
Потом при запуске ansible у меня возникла эта проблема
и проверка пипа показала, что парамико требуется более новый setuptools
Обратите внимание, что ansible требует только setuptools (без версии), и поэтому pip сообщил о зависимости, удовлетворяемой System setuptools.
Решение
Я решил путем удаления каких - либо локальные библиотек питона , используя процесс намекал https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Для меня это вовлеченного
Затем я удалил символические ссылки и исполняемые файлы в / 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
которых отдельно от системных библиотек at,/System/Library/Frameworks/Python.framework
и/usr/bin
поэтому я получаюИ в
pip list
ANSIBLE теперь работает на меня
источник
Для меня
PATH
пропалpip
, это было подтверждено бегомpython -m pip
Два возможных решения здесь, добавьте
pip
обратноPATH
. В моем случаеpip
все равно было устаревшим, поэтому обновление исправило это:python -m pip install --upgrade pip
✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
источник