Эта проблема часто возникает, когда 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:
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/
. Это также делает невозможным использование новых пакетов с тем же именем, что и у модулей из стандартной библиотеки.
Вы можете обойти эти проблемы, но метод зависит от ваших ответов на три вопроса.
- Вы хотите продолжить использовать версию Python для Mac OS X или установить свою собственную? Самостоятельная установка - это самый безопасный вариант, который можно выполнить через официальный установщик Python, Homebrew или Anaconda. Это также то, что Apple рекомендует , как отмечает @Sacrilicious . Если вы устанавливаете свою собственную версию 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 для всех пользователей :
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 ...
, то вы должны поместить этот файл в свой домашний каталог (~).
Эти настройки не позволят 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, чтобы общие элементы находились тогда, когда они вам нужны:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
Примечание: вам нужно будет запустить новую оболочку или запустить ее в командной строке, чтобы изменения вступили в силу. Вы также можете запустить, 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:
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>