Как использовать pip после обновления ОС X El Capitan?

После обновления El Capitan я не могу запустить pp install. Ошибка, которую я получаю, заключается в том, что «операция не разрешена», когда 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?

113 голосов | спросил web_ninja 7 +03002015-10-07T00:33:34+03:00312015bEurope/MoscowWed, 07 Oct 2015 00:33:34 +0300 2015, 00:33:34

12 ответов


84

Быстрое решение - использовать homebrew для установки python в /usr/local/bin, чтобы ваш pip мог работать с изменяемой пользователем структурой python.

brew install python
pip --version

Отключение защиты целостности системы также является опцией, но я не рекомендую ничего, кроме профессионального и где у вас есть рабочая сила для управления обнаружением вторжений или если вы являетесь разработчиком /системным администратором, и вам нужно протестировать вещи с помощью SIP и без него.

ls -lO /System/Library/Frameworks/Python.framework/Versions/2.7/
csrutil status

Вы увидите, что установлен флаг ограниченный , который не может быть удален даже с правами root при включенном SIP.

Использование homebrew позволяет управлять пипсом и питоном отдельно, чем версия, предоставленная системой. В качестве бонуса платформа homebrew предназначена для облегчения обслуживания и патчей /обязанностей с помощью автоматизации.

ответил bmike 7 +03002015-10-07T01:16:35+03:00312015bEurope/MoscowWed, 07 Oct 2015 01:16:35 +0300 2015, 01:16:35
77

Другим жизнеспособным вариантом без необходимости отключения SIP или установки других версий Python является установка модулей только для текущего пользователя с помощью

pip install --user <modulename>

Если это только ваша персональная машина, это будет самое простое и безопасное решение.

ответил Michal Příhoda 7 62015vEurope/Moscow11bEurope/MoscowSat, 07 Nov 2015 12:37:12 +0300 2015, 12:37:12
55

Эта проблема часто возникает, когда pip пытается установить man-страницу для IPython на El Capitan. Быстрое исправление заключается в использовании команды pip, например:

sudo -H pip install --install-option '--install-data=/usr/local' <package>

Тем не менее, защита целостности системы (SIP) на El Capitan блокирует несколько неправильных действий с помощью пипа, который использовался для перемещения по слайду, поэтому вам, вероятно, потребуется внести еще несколько изменений, чтобы обеспечить бесперебойную работу пула на El Capitan.

SIP на El Capitan раскрывает три проблемы с использованием pip с поставляемой Apple версией Python на OS X:

  1. 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'

  2. 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 . .

  3. Apple версия Python добавляет несколько каталогов в /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/. Это также делает невозможным использование новых пакетов, которые имеют то же имя, что и модули из стандартной библиотеки.

Вы можете обойти эти проблемы, но метод зависит от ваших ответов на три вопроса.

  1. Вы хотите продолжить использовать версию Python для Mac OS X или установить свой собственный? . Установка вашего собственного является самым безопасным вариантом и может быть выполнена через официальный установщик Python, Homebrew или Anaconda. Это также означает, что указал @Sacrilicious . Если вы установите свою версию Python, вам, вероятно, следует удалить все, что в настоящее время установлено в /Library/Python/2.7/site-packages, и любые сценарии, которые были установлены в /usr/local/bin для этих пакетов (включая pip). В противном случае у вас будет досадный опыт работы с некоторыми сценариями, доступ к установленной на компьютере версии Python, а также доступ к вашей собственной установке.

Если вы хотите придерживаться установленного системой Python, вы должны принять еще два решения:

  1. Вы хотите установить пакеты для всех пользователей или только для себя? Установка для всех пользователей гарантирует, что каждая программа, использующая Python (включая, возможно, административные скрипты), будет иметь доступ ко всем пакеты, которые вы устанавливаете. Тем не менее, есть далекий шанс, что это будет мешать собственному использованию El Capitan Python. (Я надеюсь, что Apple использует python -S, чтобы гарантировать, что они всегда получат пакеты, которые они ожидают, но у меня нет возможности проверить это.) Установка только для вашей собственной учетной записи пользователя исключает возможность вмешательства установка системы Python. Примечание. Если вы собираетесь переключиться с общесистемной установки на пользовательскую, вы, вероятно, должны воспользоваться этой возможностью, чтобы удалить все, что в настоящее время установлено в /Library/Python/2.7/site-packages и связанных сценариях в /usr/local/bin.

  2. Вы хотите скрыть дополнительные пакеты, которые установлены с версией 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. (Если вам это нужно, вы можете получить доступ, привязав их в каталог вашего сайта-пакетов.)

Теперь, вот обходные пути. Это было бы хорошей практикой для всех версий OS X, чтобы избежать случайной замены или удаления пакетов Python, используемых операционной системой; однако они необходимы, если вы хотите использовать установленные пользователем пакеты с поставляемой Apple версией Python на OS X El Capitan (10.11).

Установить pip

Возможно, вы это уже сделали, но если нет, вы можете использовать следующую команду для установки pip для всех пользователей :

sudo -H easy_install pip
# pip script will be installed in /usr/local/bin

Или используйте эту команду для установки pip только для собственной учетной записи пользователя :

easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin

Управление локальными расположениями файлов

Если вы устанавливаете пакеты для всех пользователей, создайте файл с именем .pydistutils.cfg с этими строками (от https://github.com/pypa/pip/issues/426 ):

[install]
install-data=/usr/local
install-headers=/usr/local

Если вы обычно используете sudo -H pip ..., тогда вы должны поместить этот файл в /var/root (домашний каталог для пользователя root). Если вы обычно используете sudo pip ..., то вы должны поместить этот файл в свой собственный домашний каталог (~).

Эти настройки не позволят пипсу пытаться записывать общие элементы, такие как заголовки и manpages, в /Library/System. (Команда в верхней части этого ответа является более быстрой версией того же самого.) Эти параметры необходимы, потому что код, зависящий от darwin, в /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, чтобы общие элементы были найдены, когда они вам понадобятся:

export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH

Примечание: вам нужно будет запустить новую оболочку или запустить их в командной строке, чтобы изменения вступили в силу. Вы также можете запустить hash -r, если вы недавно удалили старые сценарии из этого пути.

Управление контуром Python

Вам нужно будет убедиться, что пакеты, которые вы устанавливаете, выше в порядке поиска 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 версии:

pip install --ignore-installed --user setuptools   # your account only
# or
sudo -H pip install --ignore-installed setuptools  # all users

Затем введите следующий код в fix_mac_path.pth в указанном выше месте:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

Если вы хотите использовать установленные Apple пакеты, , вам не нужно устанавливать другую копию setuptools. Просто введите следующий код в fix_mac_path.pth в указанном выше месте:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

После этого вы можете использовать python -m site, чтобы убедиться, что порядок поиска пути имеет смысл.

Установить пакеты

После этого вы сможете установить новые пакеты с помощью одной из следующих команд.

Для всех пользователей:

sudo -H pip install <package>

Для вашего собственного пользователя:

pip install --user <package>
ответил Matthias Fripp 12 Jam1000000amTue, 12 Jan 2016 11:45:57 +030016 2016, 11:45:57
31

Во-первых, вы не отключите SIP как способ решения проблемы. К сожалению, причина в том, что создание этой папки не работает, но мы должны ее обойти. Во-вторых, вы теряете все тонкости, которые Apple думала, что они дают вам, как мост через pyObjC, когда вы устанавливаете свой собственный Python.
(Я соглашусь, они говорят , вы должны установить свой собственный код /usr/local, если вы разработчик, я просто , чтобы сделать это простым способом с пивом.)

Логически, вы бы подумали, что нужно установить его где-то SIP не блокирует вас, и это почти наверняка зависит от вас. Сообщение о том, где вы хотите, чтобы он выполнял установки, не является средством, так как он игнорирует ранее существовавший материал в /System, где он будет проверять зависимости для многих распространенных инсталляций, которые нужны, например six, и SIP заставляет pip ломаться, когда он идет, чтобы попробовать и обновить его. На самом деле поведение по умолчанию в приложении ppp для установки в /Library/Python/2.7/site-packages, вам просто нужно сказать --ignore-installed, чтобы заставить его устанавливать любые обновленные версии зависимостей там.
... К сожалению, вы можете перейти на импорт этого модуля в интерактивном сеансе или скрипте и получить хорошие отказы жира - он все еще смотрит на /не обновленный пакет системы!

С ранних дней 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 - это наилучшая практика для большинства людей в любом случае.

ответил Sacrilicious 9 +03002015-10-09T03:46:45+03:00312015bEurope/MoscowFri, 09 Oct 2015 03:46:45 +0300 2015, 03:46:45
4

Я думаю, что это из-за SIP или защиты целостности системы , своего рода защита файлов в реальном времени, которая похожа на антивирус Windows :) и останавливает любые изменения, которые вы хотите внести в системные папки OS X. Apple просто решила отключить системные модификации - чтобы быть уверенным, что вы полностью защищены от зла ​​Интернета и других связанных с компьютером сил зла SIP защищает нас от.

Если вы хотите отключить SIP , вам нужно загрузиться в Recovery HD, удерживая клавиши Command + R одновременно при загрузке вашего Mac.

Откройте терминал из меню «Утилиты» и введите csrutil disable, затем нажмите «возврат». Перейдите в меню Apple, чтобы перезагрузить компьютер.

SIP будет отключен с этого момента. Я давно отключил его и не заметил ничего плохого, некоторые процессы, похоже, жалуются, но они всегда делают это на OS X, поэтому я не уверен, вызвано ли это отсутствием защиты системы Integrity

Мой совет - полностью избавиться от SIP и /или использовать доморощенный для всего вашего программного обеспечения с открытым исходным кодом /разработки. Homebrew использует каталог /usr /local для его выпуска и не сталкивается с другими системными компонентами, а сборки homebrew являются более современными, а затем строятся os x apple.

ответил PJJ 7 +03002015-10-07T01:00:48+03:00312015bEurope/MoscowWed, 07 Oct 2015 01:00:48 +0300 2015, 01:00:48
4

Использовал pip3 install <package> и решил проблему разрешения в pip.

ответил Keng 29 +03002015-10-29T16:50:25+03:00312015bEurope/MoscowThu, 29 Oct 2015 16:50:25 +0300 2015, 16:50:25
4

Поверьте мне, вы действительно не хотите, чтобы библиотека ничего писала на этом пути.

Ранее это не рекомендуется, но можно записать в /System/Library/Frameworks/Python.framework/Versions/2.7/, но теперь он не поддерживается из-за Apple SIP, и поэтому это библиотека владелец проблема. Распространение пакета должно быть обновлено для правильной работы с этим обновлением. Большинство пакетов были обновлены и установили свой контент в /Library/Python/2.7/site-packages, но некоторые пакеты не были обновлены.

В моем случае, это была библиотека зелеток, пытающаяся записать файл .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/проблемы /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', ... ] перед системными путями - вот почему (и как) он работает.

ответил Yuri Baburov 6 FebruaryEurope/MoscowbSat, 06 Feb 2016 14:54:45 +0300000000pmSat, 06 Feb 2016 14:54:45 +030016 2016, 14:54:45
3

Я сделал это следующим образом:

brew install python

, после установки python:

sudo easy_install pip
ответил motionpotion 14 62015vEurope/Moscow11bEurope/MoscowSat, 14 Nov 2015 23:02:25 +0300 2015, 23:02:25
3

Очень крутым решением для этой проблемы является использование virtualenv (virtualenvwrapper), после создания новой среды для вашего проекта вы можете использовать pip без проблем, поэтому я использовал virtualenvwrapper, и эти две строки исправить проблему:

mkproject <project_name>
pip install <package_name>
ответил neosergio 14 Jpm1000000pmThu, 14 Jan 2016 21:56:32 +030016 2016, 21:56:32
2

У меня есть python3, установленный на моем mac, в то время как исходный python2.7 поставляется с OSX. Поэтому всякий раз, когда я хочу вызвать python3, я просто набираю $ python3 .... Может быть, вы должны попробовать $ python3 get-pip.py, это работает для меня, когда у меня есть почти такая же проблема с вами.

ответил dynamitez 24 J0000006Europe/Moscow 2016, 10:25:11
2

Резюме

Я столкнулся с этой проблемой в Mac OS X 10.11.6 (у которой есть SIP), потому что я установил pip с помощью System easy_install, а локальный easy-install.pth ссылался на системные библиотеки.
При установке последующих пакетов с помощью пипа некоторые из зависимостей были разрешены для старых системных библиотек Python.
Решение заключалось в том, чтобы удалить локально установленные библиотеки и переустановить локальную версию python (включая pip) из https: //www.python.org/downloads/, так что системные и локально установленные экземпляры python сохраняются отдельно.
Я попытался использовать исправление fix_mac_path.pth в ответе @mfripp , однако я обнаружил удаление и переустановку очистителя.

Причина

(Не выполняйте следующие шаги)

Я ударил эту проблему, пытаясь установить Ansible. Я следил за документами Ansible для установки на OS X через pip
Сначала я установил pip с помощью sudo easy_install pip
Это использовало System easy_install в /usr/bin/easy_install и установил pip в /Library/Python/2.7/site-packages/pip
После установки pip я получил предупреждения, но я проигнорировал их и вспахал вслепую.

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
warning: no previously-included files found matching '.coveragerc'
...
Adding pip 9.0.1 to easy-install.pth file
Installing pip script to /usr/local/bin
...
Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg
...
Finished processing dependencies for pip

Позже, посмотрев на /Library/Python/2.7/site-packages/easy-install.pth, он выглядел так:

import sys; sys.__plen = len(sys.path)
./pip-9.0.1-py2.7.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

Затем я установил доступный через pip

sudo pip install ansible

У меня появились сообщения о том, что требования уже выполнялись системными библиотеками

Requirement already satisfied: setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from ansible)  
Requirement already satisfied: six>=1.4.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from cryptography>=1.1->paramiko->ansible)

Тогда при запуске ansible я получил эту проблему

VersionConflict: (setuptools 1.1.6 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python), Requirement.parse('setuptools>=11.3'))

, а проверка пика показала, что paramiko потребовал новых настроек setup

pip check paramiko
matplotlib 1.3.1 requires tornado, which is not installed.
matplotlib 1.3.1 requires nose, which is not installed.
cryptography 1.7.2 has requirement setuptools>=11.3, but you have setuptools 1.1.6.

Обратите внимание на то, что только требуемые setuptools (без версии) необходимы, и поэтому pip сообщил о зависимости, удовлетворяемой установками System setup.png.

Решение

Я решил это, удалив любые локальные библиотеки python, используя процесс, намеченный на https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Для меня это связано

sudo rm -rf /Library/Python

Затем я удалил символические ссылки и исполняемые файлы в /usr /local /bin, например

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*

и т. д. Я также удалил любые приложения

sudo rm -rf /Applications/Python\ 2.7/

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

Это установил локальный питон и пип на /Library/Frameworks/Python.framework/Versions/2.7 и символические ссылки в /usr/local/bin, который отделен от системные библиотеки в /System/Library/Frameworks/Python.framework и /usr/bin так что я получаю

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

и в списке pip list

setuptools (28.8.0)
six (1.10.0)

ansible теперь работает для меня

ответил Jason S 4 MaramSat, 04 Mar 2017 10:42:26 +03002017-03-04T10:42:26+03:0010 2017, 10:42:26
1

Для меня 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)

ответил Vinnie James 10 PM00000070000001931 2017, 19:57:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132