Ten problem często pojawia się, gdy pip próbuje zainstalować stronę dla IPythona na El Capitan. Szybka poprawka polega na użyciu polecenia pip w następujący sposób:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
Jednak ochrona integralności systemu (SIP) na El Capitan blokuje kilka złych praktyk za pomocą pip, które były używane do przesuwania, więc prawdopodobnie będziesz musiał wprowadzić kilka zmian, aby pip działał płynnie na El Capitan.
SIP na El Capitan przedstawia trzy problemy z użyciem pip z dostarczoną przez Apple wersją Pythona na OS X:
distutils nie ustawia poprawnie dwóch ważnych zmiennych na komputerach Mac, więc pip próbuje pisać nagłówki i inne udostępnione pliki (np. strony podręcznika) pod /System/Library/Frameworks/Python.framework/Versions/2.7/
. To zły pomysł, ale we wcześniejszych wersjach OS X udało się, jeśli pip został uruchomiony z sudo. Jednak zawodzi na El Capitan z powodu SIP. To jest błąd, na który wpadłeś. Daje wiadomości takie jak OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple instaluje nieaktualne wersje niektórych pakietów w /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(np. sześć). W poprzednich wersjach OS X, kiedy zainstalowałeś pakiet, który potrzebował nowszej wersji jednego z nich, sudo pip
po cichu usunie starą wersję z /System/
folder i zainstaluj nowszą wersję /Library/Python/2.7/site-packages
. Był to również zły pomysł i nie jest już możliwy z SIP. Ale teraz pip ulegnie awarii z komunikatem o błędzie podczas próby usunięcia starego pakietu. Ta wiadomość jest również OSError: [Errno: 1]
, ale przychodzi po takiej wiadomości Uninstalling six-1.4.1:
. Zobacz np. https://github.com/pypa/pip/issues/3165 .
Wersja Pythona firmy Apple dodaje kilka katalogów pod /System/Library/Frameworks/Python.framework/Versions/2.7/
do ścieżki wyszukiwania Pythona powyżej standardowe lokalizacje instalacji pakietu dostępne dla użytkownika. Więc jeśli zainstalujesz nowszą wersję pakietu w innym miejscu (np. sudo -H pip install --ignore-installed six
), otrzymasz komunikat, że instalacja się powiodła, ale po uruchomieniu pythona otrzymasz starszą wersję /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. To także uniemożliwia użycie nowych pakietów, które mają taką samą nazwę jak moduły ze standardowej biblioteki.
Możesz obejść te problemy, ale metoda zależy od odpowiedzi na trzy pytania.
- Czy chcesz kontynuować korzystanie z wersji Pythona w systemie Mac OS X lub zainstalować własną? Instalacja własnego jest najbezpieczniejszą opcją i można to zrobić za pomocą oficjalnego instalatora Pythona, Homebrew lub Anaconda. To też jest to Apple zaleca , tak jak wskazany przez @Sacrilicious . Jeśli zainstalujesz własną wersję Pythona, prawdopodobnie powinieneś odinstalować wszystko, co jest aktualnie zainstalowane
/Library/Python/2.7/site-packages
oraz wszelkie skrypty, które zostały zainstalowane /usr/local/bin
dla tych pakietów (w tym pip). W przeciwnym razie będziesz miał irytujące doświadczenie z niektórymi skryptami uzyskującymi dostęp do zainstalowanej w systemie wersji Pythona i niektórych uzyskujących dostęp do własnej instalacji.
Jeśli chcesz trzymać się Pythona zainstalowanego w systemie, musisz podjąć jeszcze dwie decyzje:
Czy chcesz zainstalować pakiety dla wszystkich użytkowników, czy tylko dla siebie? Zainstalowanie dla wszystkich użytkowników zapewnia, że każdy program używający Pythona (włączając w to skrypty administracyjne) będzie miał dostęp do wszystkich instalowanych pakietów. Istnieje jednak odległa szansa, że zakłóci to wykorzystanie Pythona przez El Capitan. (Mam nadzieję, że Apple użyje python -S
aby upewnić się, że zawsze otrzymują pakiety, których oczekują, ale nie mam możliwości przetestowania tego.) Instalacja tylko dla własnego konta użytkownika eliminuje możliwość ingerencji w systemową instalację Pythona. Uwaga: jeśli zamierzasz przełączyć się z instalacji na cały system na tylko użytkownika, prawdopodobnie powinieneś skorzystać z okazji, aby odinstalować wszystko, co jest aktualnie zainstalowane w /Library/Python/2.7/site-packages
i powiązane skrypty w /usr/local/bin
.
Czy chcesz ukryć dodatkowe pakiety instalowane z wersją Pythona systemu OS X? (pod /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) lub zachować je w ścieżce wyszukiwania? Zalecam ich ukrycie, aby najnowsze wersje tych pakietów były automatycznie instalowane w miejscach dostępnych dla użytkownika, gdy zajdzie taka potrzeba. Jeśli nie ukryjesz tego katalogu, od czasu do czasu otrzymasz wiadomości, że pip nie mógł usunąć istniejącego pakietu, aby uaktualnić go do nowszej wersji (wymaganej przez inny instalowany pakiet). W takim przypadku musisz uruchomić pip install --ignore-installed <package>
, który zainstaluje nowszą wersję i ukryje wersję zainstalowaną w systemie. Jeśli jednak ukryjesz całość /System/.../Extras/...
katalog, utracisz dostęp do niektórych pakietów Apple, które nie są dostępne za pośrednictwem pip, tj. CoreGraphics i bonjour. (Jeśli ich potrzebujesz, możesz uzyskać dostęp poprzez dowiązanie symboliczne do katalogu pakietów-stron).
Oto sposoby obejścia. Byłyby to dobre praktyki we wszystkich wersjach OS X, aby uniknąć przypadkowego zastąpienia lub usunięcia pakietów Pythona używanych przez system operacyjny; jednak są one niezbędne, jeśli chcesz używać pakietów instalowanych przez użytkownika z dostarczoną przez Apple wersją Pythona na OS X El Capitan (10.11).
Zainstaluj pip
Prawdopodobnie już to zrobiłeś, ale jeśli nie, możesz użyć następującej komendy, aby zainstalować pip dla wszystkich użytkowników :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
Lub użyj tego polecenia, aby zainstalować pip tylko dla własnego konta użytkownika :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
Zarządzaj udostępnionymi lokalizacjami plików
Jeśli instalujesz pakiety dla wszystkich użytkowników, utwórz plik o nazwie .pydistutils.cfg z tymi liniami (z https://github.com/pypa/pip/issues/426 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Jeśli zazwyczaj używasz sudo -H pip ...
, to powinieneś umieścić ten plik w /var/root
(katalog domowy dla użytkownika root). Jeśli zazwyczaj używasz sudo pip ...
, następnie powinieneś umieścić ten plik w swoim własnym katalogu domowym (~).
Te ustawienia uniemożliwią pipowi pisanie elementów udostępnionych, takich jak nagłówki i strony podręcznika /Library/System
. (Polecenie na początku tej odpowiedzi jest szybszą wersją tego samego.) Te ustawienia są potrzebne, ponieważ kod specyficzny dla darwina w /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
nie ustawia tych zmiennych do lokalizacji zapisywalnych przez roota (chociaż poprawnie ustawia inne zmienne). Więcej informacji na ten temat można znaleźć na stronie https://github.com/pypa/pip/issues/3177 .
Jeśli instalujesz pakiety tylko dla swojego konta użytkownika, elementy udostępnione zostaną automatycznie zainstalowane pod ~/Library/Python/2.7/
. Ale powinieneś dodać następujące linie do ~ / .profile, aby udostępnione elementy były znalezione, gdy ich potrzebujesz:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
Uwaga: będziesz musiał uruchomić nową powłokę lub uruchomić ją w wierszu poleceń, aby zmiany odniosły skutek. Możesz także chcieć uruchomić hash -r
jeśli niedawno usunąłeś stare skrypty ze ścieżki.
Zarządzaj ścieżką Pythona
Musisz upewnić się, że instalowane pakiety są wyższe w kolejności wyszukiwania Pythona niż pakiety zainstalowane w systemie. Najłatwiej to zrobić za pomocą .pth
pliki. To wynika z sugestii Sacrilicious gdzie indziej na tej stronie , ale zapewnia, że katalog użytkownika site-packages jest przeszukiwany przed katalogiem pakietów systemowych dla całego systemu, i oba są przeszukiwane przed standardową biblioteką i katalogiem Apple Extras (oba w katalogu / System / ...). Pomija także /System/.../Extras
w razie potrzeby ze ścieżki wyszukiwania.
Utwórz plik o nazwie fix_mac_path.pth
, z tekstem poniżej. Jeśli instalujesz pakiety dla wszystkich użytkowników, fix_mac_path.pth
należy umieścić w /Library/Python/2.7/site-packages
. Jeśli instalujesz tylko dla własnego użytkownika, fix_mac_path.pth
powinien być w ~ / Library / Python / 2.7 / lib / python / site-packages. (Ten plik może mieć dowolną nazwę, ale musi być umieszczony w jednej lub obu lokalizacjach i musi kończyć się .pth
; również cały tekst w tym pliku musi być w jednym wierszu.)
Jeśli chcesz ukryć zainstalowane w Apple pakiety /System/.../Extras
:
Najpierw uruchom jedno z następujących poleceń, aby uzyskać roboczą kopię pip / setuptools niezależnie od wersji dostarczonej przez Apple:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
Następnie wprowadź następujący kod fix_mac_path.pth
w miejscu określonym powyżej:
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
Jeśli chcesz nadal korzystać z pakietów zainstalowanych przez Apple, nie musisz instalować innej kopii narzędzi konfiguracyjnych. Po prostu wprowadź następujący kod fix_mac_path.pth
w miejscu określonym powyżej:
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
Po tym możesz użyć python -m site
aby upewnić się, że kolejność wyszukiwania ścieżek ma sens.
Zainstaluj pakiety
Następnie powinieneś być w stanie zainstalować nowe pakiety za pomocą jednego z następujących poleceń.
Dla wszystkich użytkowników:
sudo -H pip install <package>
Dla własnego użytkownika:
pip install --user <package>