Po aktualizacji El Capitan nie mogę uruchomić instalacji pip. Błąd, który otrzymuję, jest taki, że „operacja nie jest dozwolona”, gdy pip próbuje utworzyć nowe foldery podczas instalacji.
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
W zasadzie nie mogę tworzyć folderów itp. W tych folderach. Próbowałem użyć sudo, które nie pomaga. Również zrobiłem
sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/
Powyższe też nie pomogło. Co mogę zrobić, aby ponownie zainstalować biblioteki Pythona?
macos
el-capitan
permission
python
authorization
web_ninja
źródło
źródło
Odpowiedzi:
Szybkie rozwiązanie to użycie homebrew żeby zainstalować
python
w/usr/local/bin
tak, że twójpip
może działać na modyfikowanej przez użytkownika strukturze Pythona.Wyłączanie ochrony integralności systemu jest również opcją, ale nie polecam tego na nic innego niż profesjonalnie zarządzane i zamurowane serwery, na których masz siłę roboczą do zarządzania wykrywaniem włamań lub jeśli jesteś programistą / administratorem i musisz testować rzeczy z SIP i bez.
Zobaczysz, że ograniczony ustawiona jest flaga, której nie można usunąć nawet jako root, gdy włączony jest SIP.
Użycie homebrew umożliwia zarządzanie pip i python oddzielnie niż wersja dostarczona przez system. Dodatkową korzyścią jest to, że framework homebrew został zaprojektowany w celu ułatwienia utrzymania i poprawek / obowiązków poprzez automatyzację.
źródło
brew install python
jest najprostszą opcją, chociaż czyszczenie niektórych innych ustawień może być wymagane, jeśli korzystasz z systemu Python przez jakiś czas (np. pliki Pythona należące do roota pod/usr/local/bin
i~/Library/Caches/pip
)brew
ponieważ łatwo przypiąć odpowiednią wersję - zarządzaj wieloma różnymi wersjami lub regularnie aktualizuj rzeczy. Jeśli masz coś, co działa dla ciebie - trudno się spierać, że powinieneś coś zmienić.Inną możliwą opcją bez konieczności wyłączania SIP lub instalowania innych wersji Pythona, jest instalacja modułów tylko dla bieżącego użytkownika za pomocą
Gdyby to był tylko twój osobisty komputer, byłoby to najprostsze i najbezpieczniejsze rozwiązanie.
źródło
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:
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 jakOSError: [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ściUninstalling 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.
/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 :
Lub użyj tego polecenia, aby zainstalować pip tylko dla własnego konta użytkownika :
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 ):
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żywaszsudo 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: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:
Następnie wprowadź następujący kod
fix_mac_path.pth
w miejscu określonym powyżej: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: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:
Dla własnego użytkownika:
źródło
Po pierwsze, nie wyłączasz SIP jako sposobu na rozwiązanie tego problemu. Przepraszamy za to, że tworzenie tego folderu zawodzi, ale musimy go obejść. Po drugie, tracisz wszystkie niuanse, które Apple myślał, że dają ci, jak most przez pyObjC, kiedy instalujesz swój własny Python.
(Przyznam się, Mówią powinieneś zainstalować swój własny
/usr/local
jeśli jesteś programistą, po prostu sprzeciwić się temu w prosty sposób z naparem.)Logicznie rzecz biorąc, pomyślałbyś o zainstalowaniu go gdzieś w SIP, który cię nie blokuje, a to prawie na pewno rozwiązuje jakiś problem z zależnością. Powiadamianie pip o tym, gdzie ma być przeprowadzane instalowanie, nie jest rozwiązaniem tak bardzo, jak zignorowanie wcześniej istniejących rzeczy w / System, gdzie sprawdzane są zależności dla wielu typowych instalacji, które wymagają np.
six
, a SIP powoduje, że pip się łamie, gdy próbuje go zaktualizować. W rzeczywistości jest to domyślne zachowanie pip do instalacji w /Library/Python/2.7/site-packages, wystarczy powiedzieć--ignore-installed
aby zmusić go do zainstalowania tam zaktualizowanych wersji zależności.... Niestety, możesz następnie zaimportować ten moduł w interaktywnej sesji lub skrypcie i uzyskać niezłe fatalne błędy - wciąż patrzysz na niezaktualizowany pakiet / System!
Od wczesnych dni instalacji Python ma sposób na wyraźne sprawdzenie tego wyszukiwania. Wygląda to nieco dziwnie (i powinno wywołać pauzę dla tych z nas, którzy są świadomi bezpieczeństwa i nie są zachwyceni tępością przesuwania go na szczyt listy bez sprawdzania, ale) możesz umieścić plik, który kończy się na
.pth
(np. „elcap.pth”) w/Library/Python/2.7/site-packages
aby przesunąć ten katalog na początek kolejności wyszukiwania o następującej treści:import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path
Rozpocznij nową sesję i szybką wycieczkę do
python -m site
potwierdzi, że wstawiłeś tę ścieżkę do pierwszego gniazda, a importowanie modułów powinno działać.Aha, po tym wszystkim spróbuj po prostu zainstalować za pomocą pip
--user
opcja lub użycie a virtualenv - i tak jest to najlepsza praktyka dla większości ludzi.źródło
--user
lub użyj virtualenv. Jestem po prostu umysłem, administratorem, który instalujesz raz dla systemu i że użytkownik powinien być w stanie nadpisać system. Sprzeciw wobec tego rozwiązania może polegać na tym, że system będzie patrzył na zmienioną ścieżkę, ale istnieje precedens, że easy_install może również zapisać plik .pth.sudo pip install --ignore-installed ipython
i działa aż do uruchomienia „instalacji setup.py dla pexpect”, w którym punkt pip nadal próbuje uaktualnić coś w /System/Library/Frameworks/Python.framework/Versions/2.7/share, a także błędy.pip --user
i virtualenv nadal nie działa.Myślę, że to z powodu łyk lub Ochrona integralności systemu , rodzaj ochrony plików w czasie rzeczywistym, która przypomina antywirusa systemu Windows :) i zatrzymuje wszelkie zmiany, które chcesz wprowadzić w folderach systemowych OS X. Apple po prostu postanowił wyłączyć modyfikacje systemu - aby mieć pewność, że jesteś w pełni chroniony przed złem Internetu i innych komputerowych sił zła łyk chroni nas przed.
Jeśli chcesz wyłącz SIP musisz uruchomić Recovery HD, przytrzymując Command + R klawisze jednocześnie podczas uruchamiania komputera Mac.
Otwórz terminal z menu Narzędzia i wpisz
csrutil disable
, a następnie naciśnij przycisk powrotu. Przejdź do menu Apple, aby ponownie uruchomić komputer.SIP będzie teraz wyłączony. Wyłączyłem go dawno temu i nie zauważyłem niczego złego, niektóre procesy wydają się narzekać, ale zawsze działają na OS X, więc nie jestem pewien, czy jest to spowodowane brakiem ochrony integralności systemu
Moja rada to całkowite pozbycie się SIP i / lub korzystanie z homebrew dla całego swojego oprogramowania typu opensource / development. Homebrew używa katalogu / usr / local dla swojej instalacji i nie koliduje z innymi komponentami systemu, i homebrew kompilacje są bardziej aktualne niż kompilacja jabłek.
źródło
/System
; niedostępne od 10.11. Możemy użyć csrutil do tymczasowego wyłączenia go, jeśli jesteśmy uszczypnięci, chociaż wiem, że może się wydawać, że może się on zmienić w kula, ale to nie wydaje się być dobrym powodem, aby go użyć. Odejście to jest… dlaczego nie możemy mieć miłych rzeczy.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
i nie mam powodu, aby go włączyć, ponieważ mój system jest dość mocno zamknięty i dostosowanyUżywany
pip3 install <package>
zamiast tego rozwiązałem problem z uprawnieniami wpip
.źródło
Wierz mi, nie chcesz, aby biblioteka zapisywała cokolwiek na tej ścieżce.
Poprzednio nie był zalecany, ale można go zapisać
/System/Library/Frameworks/Python.framework/Versions/2.7/
, ale teraz nie jest obsługiwany z powodu Apple SIP, a więc jest to problem właściciela biblioteki. Dystrybucja pakietów powinna zostać zaktualizowana, aby działała poprawnie z tą aktualizacją. Większość pakietów została zaktualizowana i zainstalowała ich zawartość/Library/Python/2.7/site-packages
, ale niektóre pakiety nie zostały zaktualizowane.W moim przypadku była to biblioteka zielonkowa, która próbowała ją napisać
.h
plik do folderu System Frameworks:Jak to naprawić:
sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/"
następniesudo -H pip install gevent
Dla numpy poprawka jest
sudo -H pip install --ignore-installed -U numpy
.W przypadku innych bibliotek poprawki różnią się od https://github.com/pypa/pip/issues/3177 do
pip install --ignore-installed six
ipip install --user
(ostatni instaluje wszystko w /User//Library/Python/2.7/ path). Zobacz także aktualną najlepszą odpowiedź na ten post: https://apple.stackexchange.com/a/210021/169157Jeśli wpiszesz
python -m site
powinien zawieraćsys.path = [ ... '/Library/Python/2.7/site-packages', ... ]
przed ścieżkami systemowymi - dlatego (i jak) działa.źródło
Zrobiłem to w następujący sposób:
następnie po zainstalowaniu pythona:
źródło
brew install python
już instaluje z nim pip. Jeśli następnie zainstalujesz pip za pomocą easy_install, prawdopodobnie skończysz z dwoma instalacjami pip, które mogą prowadzić do mylących problemów.Bardzo fajnym rozwiązaniem dla tego problemu jest użycie virtualenv (virtualenvwrapper), po utworzeniu nowego środowiska dla projektu, możesz użyć pip bez problemów, więc użyłem virtualenvwrapper i te dwie linie rozwiązują problem:
źródło
pip install virtualenv
lub czy pip nie działa i musisz się uciekaćsudo easy_install
+1 za to, co już tu jest. Twoje zdrowiesudo easy_install
PraceMam python3 zainstalowany na moim Mac, podczas gdy oryginalny python2.7 pochodzi z OSX. Więc kiedykolwiek chcę wywołać python3, po prostu wpisz $ python3 .... Może powinieneś spróbować $ python3 get-pip.py, to działa dla mnie, gdy mam prawie taki sam problem z tobą.
źródło
streszczenie
Uderzyłem w ten problem w systemie Mac OS X 10.11.6 (który ma SIP), ponieważ zainstalowałem pip przy użyciu systemu easy_install, a lokalny easy-install.pth odnosił się do bibliotek systemowych.
Podczas instalowania kolejnych pakietów za pomocą pip niektóre zależności zostały rozwiązane w starszych bibliotekach System Python.
Rozwiązaniem było usunięcie moich lokalnie zainstalowanych bibliotek i ponowne zainstalowanie lokalnej wersji Pythona (która zawiera pip) https://www.python.org/downloads/ aby system i lokalnie zainstalowane instancje Pythona były oddzielone.
Próbowałem użyć poprawki fix mac path.path w odpowiedz @mfripp jednak znalazłem usunięcie i ponowne zainstalowanie czyszczenia.
Przyczyna
(Nie wykonuj tych kroków)
Uderzyłem w ten problem podczas próby instalacji Ansible. Śledziłem dokumenty Ansible do instalacji na OS X za pomocą pip
Najpierw zainstalowałem pip z
sudo easy_install pip
Wykorzystało to system easy_install at
/usr/bin/easy_install
i zainstalowany pip w/Library/Python/2.7/site-packages/pip
Podczas instalowania pip dostałem ostrzeżenia w następujący sposób, ale zignorowałem je i włączyłem ślepo.
Później patrząc na
/Library/Python/2.7/site-packages/easy-install.pth
wyglądało to takNastępnie zainstalowałem ansible przez pip
Dostałem wiadomości mówiące, że wymagania zostały już spełnione przez biblioteki systemowe
Potem, gdy uruchomiłem ansible, mam ten problem
a sprawdzanie pip wykazało, że paramiko wymaga nowszych narzędzi konfiguracyjnych
Zauważ, że ansible wymaga tylko setuptools (bez wersji), więc pip zgłosił zależność zadowalającą narzędzia konfiguracji systemu.
Rozwiązanie
Rozwiązałem to, odinstalowując wszystkie lokalne biblioteki Pythona przy użyciu wskazanego procesu https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Dla mnie to zaangażowane
Następnie usunąłem dowiązania symboliczne i pliki wykonywalne w / usr / local / bin, na przykład
i tak dalej. Usunąłem również wszystkie aplikacje
Następnie pobrałem pakiet instalacyjny 2.7.13 dla systemu Mac OS X z https://www.python.org/downloads/ i zainstalowałem go.
Zainstalował lokalny python i pip w
/Library/Frameworks/Python.framework/Versions/2.7
i dowiązania symboliczne w/usr/local/bin
który jest oddzielony od bibliotek systemowych w/System/Library/Frameworks/Python.framework
i/usr/bin
więc dostajęi w
pip list
ansible teraz działa dla mnie
źródło
Dla mnie
PATH
zaginąłpip
, zostało to potwierdzone przez uruchomieniepython -m pip
Dwa potencjalne rozwiązania tutaj, dodaj
pip
wrócić doPATH
. W moim przypadkupip
i tak był nieaktualny, więc aktualizacja go naprawiła:python -m pip install --upgrade pip
✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
źródło