Aktualizacja narzędzi instalacyjnych w systemie OSX El Capitan


81

Próbuję zaktualizować narzędzia instalacyjne. Cóż, właściwie próbuję zaktualizować ansible, ale próbuję zaktualizować narzędzia konfiguracyjne i kończy się niepowodzeniem. Próba zrobienia tego sama również kończy się niepowodzeniem. Nawet próba odinstalowania go kończy się niepowodzeniem

$ sudo -H pip install --upgrade setuptools
Collecting setuptools
  Using cached setuptools-18.4-py2.py3-none-any.whl
Installing collected packages: setuptools
  Found existing installation: setuptools 1.1.6
    Uninstalling setuptools-1.1.6:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/utils/__init__.py", line 315, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 299, in move
    copytree(src, real_dst, symlinks=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree
    raise Error, errors
Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib'")]

Nie mam zielonego pojęcia, co jest nie tak. Patrząc na wszystkie pliki w /System/Library/Frameworks/Python.framework/Versions/2.7/i poniżej, każdy plik jest własnościąroot:wheel

Jak mogę to naprawić?


2
Nie mam rozwiązania, ale mam wytłumaczenie: prawdopodobnie jest to spowodowane nową ochroną integralności systemu . pip próbuje modyfikować rzeczy, których już nie wolno, nawet z sudo. Zobacz to pytanie . Nie znalazłem jeszcze czasu, żeby się tym zająć. --userOpcja PIP jest prawdopodobnie co bym spojrzeć. Jeśli znajdziesz praktyczne rozwiązanie, aby „zaktualizować” wszystko, udostępnij je!
Arthur

Otrzymuję ipdbbłąd, który jest powiązany z setuptools. Aktualizacja setuptools nie działa. Działa z, --user=pythonale nadal nie naprawia błędu ipdb.
R11G

Odpowiedzi:


189

Dzieje się tak dzięki ochronie integralności systemu wprowadzonej w systemie OS X El Capitan.

Dodanie --user pythondo polecenia pozwoliło na to.

Innymi słowy

pip install --upgrade setuptools --user python

2
pip(w przeciwieństwie easy_install) nie wymaga sudo, ponieważ pozwalasz mu używać pythonuser, upewniłem się, że działa.
Kof

1
Działa również na CentOS 7 w kontenerze Docker. Z jakiegoś powodu
zawiodło

2
Nie udało mi się go uruchomić i nie rozumiem, jak powinna działać opcja --user. Udało mi się tymczasowo wyłączyć Ochronę integralności systemu podczas aktualizacji setuptools (w związku z instalacją ipythona), a następnie ponownie ją włączyć. Aby to zrobić: uruchom komputer w trybie odzyskiwania (cmd + R), uruchom terminal i wejdź csrutil disable. Uruchom ponownie, a po aktualizacji uruchom ponownie w trybie odzyskiwania i wejdź csrutil enable. Po ponownym uruchomieniu ipython nadal działał dobrze.
Grav,

Mogę pomyślnie wykonać to polecenie, ale aktualizacja nie jest wykonywana. Wynik wygląda następująco:Collecting setuptools Using cached setuptools-28.2.0-py2.py3-none-any.whl Requirement already up-to-date: python in /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload Installing collected packages: setuptools Successfully installed setuptools-1.1.6
diidu

W końcu udało mi się wszystko działać, postępując zgodnie z instrukcjami podanymi tutaj: apple.stackexchange.com/questions/209572/…
diidu

2

Przegląd

Problemem są sprzeczne biblioteki Pythona w połączeniu z ochroną integralności systemu (SIP) w systemie Mac OS, która chroni systemowe biblioteki Pythona.

Moim zdaniem najlepszym rozwiązaniem jest odinstalowanie i ponowne zainstalowanie własnej instalacji Pythona i pozostawienie jej oddzielnie od bibliotek Pythona dostarczanych przez Mac OS, które są chronione przez SIP.

Preferuję to wyłączenie SIP, ponieważ spodziewam się, że SIP będzie częścią wszelkich przyszłych wydań systemu Mac OS, a SIP nie jest tutaj przyczyną, po prostu ujawnia problem konfliktu bibliotek Pythona.

Detale

Miałem też ten problem podczas próby zainstalowania ansible.

Mój problem zaczął się, gdy postępowałem zgodnie z instrukcją instalacji ansibla dla Mac OS, która polega na instalacji przez pip i zainstalowaniu pip za pomocą, easy_installjak opisano w Najnowsze wydania Via Pip

Problem jest podczas instalacji pip ten sposób, tym easy_installjest Mac OS przewidziane easy_installw /usr/bin/easy_installale zapisuje do easy-install.pthpliku na/Library/Python/2.7/site-packages/easy-install.pth i że odwołania do plików Mac OS pod warunkiem bibliotek Pythona.

Następnie instalując ansible, a pip install ansiblenastępnie zgłasza, że ​​wymagania setuptools są spełnione przez bibliotekę Python pod adresem Mac OS/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible, która wymaga setuptools, ale nie określa wersji. Inny pakiet zależny, paramiko, wymaga setuptools> = 11.3, ale wydaje się, że nie jest to sprawdzane podczas instalacji ansible przez pip. Kiedy próbujesz uruchomić ansibla, narzeka, że ​​narzędzie konfiguracyjne to 1.1.6. Jest to wersja setuptools dostarczana z systemem Mac OS i jest teraz chroniona przez SIP, więc nie można jej zaktualizować.

Zamiast wyłączać SIP, naprawiłem to, odinstalowując mój lokalny Python, jak wskazałem na https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython, a następnie pobierając i instalując ponownie.

Jeśli martwisz się o rm, możesz zamiast tego mv
odinstalować

sudo rm -rf /Library/Python
sudo rm -rf /Applications/Python\ 2.7/
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*
# and so on for references to /Library/Python/2.7 in /usr/local/bin

Następnie pobrałem pakiet instalatora 2.7.13 dla Mac OS X z https://www.python.org/downloads/ i zainstalowałem go.

Spowoduje to zainstalowanie lokalnego języka Python i pip at /Library/Frameworks/Python.framework/Versions/2.7oraz dowiązań symbolicznych, /usr/local/bina także dodanie /Library/Frameworks/Python.framework/Versions/2.7do mojej ścieżki $ PATH. Dzięki temu wszystko jest oddzielone od bibliotek dostarczonych przez system Mac OS pod adresem /System/Library/Frameworks/Python.frameworki /usr/bin tak, aby uzyskać

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

Następnie zainstalowałem ansible z pip install ansible
Następnie, gdy uruchomię which ansible, dostaję

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

i w pip list

setuptools (28.8.0)
six (1.10.0)

i ansibl teraz działa dla mnie, ponieważ nowa instalacja nie odwołuje się do bibliotek Mac OS Python.

Zauważ, że z powodu ustawienia instalatora $ PATH, which pythonjest teraz /Library/Frameworks/Python.framework/Versions/2.7/bin/pythoni /usr/local/bin/pythonjest dowiązaniem symbolicznym do tego.
Jeśli chcesz systemowego Pythona, musisz użyć / usr / bin / python lub zmienić $ PATH


1

Odpowiedź jest taka, że ​​nie można aktualizować setuptools w systemie OSX dla fabrycznego języka Python dostarczanego z systemem operacyjnym. Powodem jest to, że pliki w programie /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonnie mogą być usuwane ani modyfikowane przez użytkownika. Nie tylko zwykły użytkownik, ale nawet jeśli masz uprawnienia roota, nie będziesz mógł modyfikować tych plików.

Oczywiście możesz użyć różnych innych metod, aby zainstalować nowszą wersję setuptools, ale nie zastąpi to domyślnego pakietu systemowego. Oznacza to, że jeśli wybierzesz sugerowaną trasę użycia --user pythonflagi, lub zdecydujesz się zainstalować je bez rootowania ~/Library, nie zastąpią one wersji plików systemowych.

Powodem, dla którego Ty lub root nie możecie zmodyfikować ustawień domyślnych systemu, są ograniczenia uprawnień SIP w El Capitan +. Możesz wyłączyć SIP, ale generalnie nie jest to zalecane.

Zamiast tego jedynym rozsądnym rozwiązaniem jest użycie virtualenv w Pythonie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.