Ця проблема часто виникає, коли pip намагається встановити man-сторінку для IPython на El Capitan. Швидке виправлення полягає у використанні команди pip таким чином:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
Однак Захист цілісності системи (SIP) на El Capitan блокує кілька поганих практик з pip, які раніше ковзали, тому вам, мабуть, доведеться внести ще кілька змін, щоб плавно працював піп на El Capitan.
SIP на El Capitan викриває три проблеми з використанням pip з наданою Apple версією Python в OS X:
distutils не встановлює дві важливі змінні в Macs правильно, тому pip намагається записати заголовки та інші спільні файли (наприклад, manpages) під /System/Library/Frameworks/Python.framework/Versions/2.7/
. Це погана ідея, але в попередніх версіях OS X це вдалося, якщо pip запускався з sudo. Однак він не вдається на Ель-Капітан через 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/isissue/3165 .
Версія 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/
. Це також унеможливлює використання нових пакетів, що мають те саме ім'я, що і модулі зі стандартної бібліотеки.
Ви можете подолати ці питання, але метод залежить від ваших відповідей на три питання.
- Ви хочете продовжувати використовувати версію Python для Mac OS X або встановити власну? Встановлення власного - це найбезпечніший варіант, і це можна зробити через офіційний інсталятор Python, Homebrew або Anaconda. Це також рекомендує Apple , на що вказував @Sacrilicious . Якщо ви встановлюєте власну версію Python, вам, ймовірно, слід видалити все, що зараз встановлено,
/Library/Python/2.7/site-packages
та будь-які сценарії, встановлені /usr/local/bin
для цих пакетів (включаючи pip). В іншому випадку ви будете дратувати досвід деяких сценаріїв, які отримують доступ до встановленої системою версії Python, а деякі отримують доступ до власної установки.
Якщо ви хочете дотримуватися встановленого системою Python, вам доведеться прийняти ще два рішення:
Ви хочете встановити пакети для всіх користувачів або лише для себе? Встановлення для всіх користувачів гарантує, що кожна програма, яка використовує Python (включаючи, можливо, адміністративні сценарії), матиме доступ до всіх встановлених пакетів. Однак існує ймовірність, що це заважатиме Ел Капітану самостійно використовувати Python. (Я би сподівався, що Apple використовує python -S
для того, щоб вони завжди отримували очікувані ними пакунки, але я не маю можливості перевірити це.) Встановлення лише для власного облікового запису користувача виключає можливість втручання в установку системи Python. Примітка: якщо ви збираєтеся перейти з інсталяції на загальну систему до лише користувачеві, ви, ймовірно, повинні скористатися цим шансом, щоб видалити що-небудь, встановлене в даний час, /Library/Python/2.7/site-packages
і пов'язані з ним сценарії в /usr/local/bin
.
Ви хочете приховати додаткові пакети, встановлені з версією OS X Python (під /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 для всіх користувачів :
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/isissue/426 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Якщо ви зазвичай використовуєте sudo -H pip ...
, тоді вам слід помістити цей файл у /var/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/isissue/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 в іншому місці на цій сторінці , але забезпечує пошук вашого каталогу веб-сайтів користувачів перед вашим загальносистемним каталогом пакунків сайтів, і обидва шукаються перед стандартною бібліотекою та каталогом додатків 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-пакетах. (Цей файл може мати будь-яке ім’я, яке вам потрібно, але він повинен бути розміщений в одному або обох цих місцях, і він повинен закінчуватися .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>