Pytanie Aktualizacja narzędzi setup na OSX El Capitan


Próbuję uaktualnić setuptools. Właściwie to próbuję ulepszyć ansibl, ale próbuję uaktualnić setuptools i zawodzić. Próba zrobienia tego też się nie udaje. Nawet próba odinstalowania nie powiedzie się

$ 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żdego pliku jest własnością root:wheel

Jak mogę to naprawić?


76
2017-10-20 10:50


pochodzenie


Nie mam rozwiązania, ale mam wytłumaczenie: prawdopodobnie ze względu na nowe Ochrona integralności systemu. pip próbuje modyfikować rzeczy, do których nie ma już prawa, nawet z sudo. Widzieć to pytanie. Nie poświęciłem jeszcze czasu, aby sobie z tym poradzić. The --user opcja do pip jest prawdopodobnie tym, co zajrzę. Jeśli znajdziesz praktyczne rozwiązanie, aby "zaktualizować" wszystko, udostępnij je! - Arthur
Dostaję ipdb błąd powiązany z setuptools. Aktualizacja narzędzi setupto nie działa. Działa z --user=python ale nadal nie naprawia błędu ipdb. - R11G


Odpowiedzi:


Dzieje się tak ze względu na System Integrity Protection wprowadzoną w OS X El Capitan.

Dodawanie --user python do polecenia pozwoliło to działać.

Innymi słowy

pip install --upgrade setuptools --user python

180
2017-11-13 07:38



pip (w odróżnieniu easy_install) nie wymaga sudo, ponieważ pozwalasz mu używać python użytkownik, upewniłem się, że to działa. - Kof
Przeszukałem zbyt wiele opcji, aby rozwiązanie było tak proste ... - Jacksonkr
Działa również na CentOS 7 wewnątrz kontenera Docker. Z jakiegoś powodu uległa awarii (chociaż ta sama konfiguracja zadziałała bez tego etapu sprzed maja 2016 r. ...) - geerlingguy
Nie mogłem go uruchomić i nie rozumiem, jak działa opcja -user. Dla mnie zadziałało tymczasowe wyłączenie Ochrony integralności systemu podczas aktualizacji setuptools (w związku z instalacją ipython), a następnie ponowne włączenie go. Aby to zrobić: uruchom tryb odzyskiwania (cmd + R), uruchom terminal i wprowadź csrutil disable. Uruchom ponownie, a po aktualizacji uruchom ponownie do trybu odzyskiwania i wprowadź csrutil enable. Po ponownym uruchomieniu, ipython nadal działał dobrze dla mnie. - Grav
Mogę pomyślnie wykonać to polecenie, ale nie dokonano aktualizacji. Wynik wyjściowy 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


Odpowiedź brzmi, że nie można zaktualizować setuptools na OSX dla fabrycznego pytona dostarczanego z systemem operacyjnym. Powodem jest to, że pliki w /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python nie może być usunięty lub zmodyfikowany przez użytkownika. Nie tylko zwykły użytkownik, ale nawet jeśli posiadasz uprawnienia root'a, 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 to nie zastąpi domyślnego pakietu systemowego. Znaczenie, jeśli przejdziesz sugerowaną trasę użycia --user python flagę, lub zdecydujesz się zainstalować je bez korzenia ~/Library, nie zastąpią wersji plików systemowych.

Powód, dla którego użytkownik lub root nie mogą zmienić domyślnych ustawień systemowych, wynika z ograniczeń uprawnień SIP w El Capitan +. Możesz wyłączyć SIP, ale zazwyczaj nie jest to zalecane.

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


1
2017-10-10 19:01





Przegląd

Problemem są sprzeczne biblioteki Pythona połączone z System Integrity Protection (SIP) w systemie Mac OS, które chroni systemowe biblioteki Python.

Najlepszym rozwiązaniem jest, moim zdaniem, odinstalowanie i ponowna instalacja własnej instalacji Pythona i pozostawienie tego oddzielnie w bibliotekach Pythona dostarczonych przez system Mac OS chronionych przez SIP.

Opowiadam się za wyłączeniem SIP, ponieważ oczekuję, że SIP będzie częścią przyszłych wydań Mac OS, a SIP nie jest tutaj przyczyną, po prostu ujawnia problem sprzecznych bibliotek Pythona.

Detale

Miałem również ten problem, próbując zainstalować 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 easy_install jak opisano w Najnowsze prasowe Via Pip

Problem polega na instalacji pip w ten sposób, easy_install jest dostarczony Mac OS easy_install w /usr/bin/easy_install ale pisze do easy-install.pth plik w /Library/Python/2.7/site-packages/easy-install.pth i ten plik odwołuje się do dostarczonych w systemie Mac OS bibliotek Pythona.

Następnie instalacja ansibla z pip install ansible następnie zgłasza, że ​​wymagania dotyczące setuptools są spełnione przez system Mac OS z biblioteką Python pod adresem /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible wymaga setuptools, ale nie określa wersji. Inny zależny pakiet, paramiko, wymaga setuptools> = 11.3, ale nie wydaje się, żeby to było sprawdzane podczas instalowania ansibla za pośrednictwem pip. Podczas próby uruchomienia ansibla narzeka, że ​​narzędzia do konfiguracji to 1.1.6 Jest to wersja narzędzi instalacyjnych dostarczanych 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 wskazano w https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython a następnie pobieranie i instalowanie ponownie.

Jeśli martwisz się o rm, możesz zamiast tego użyć mv
Aby odinstalować, zrobiłem

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ł go.

Zainstalował lokalny python i pip na /Library/Frameworks/Python.framework/Versions/2.7 i dowiązania symboliczne w /usr/local/bin jak również przed /Library/Frameworks/Python.framework/Versions/2.7 do mojej $ PATH. Dzięki temu wszystko jest oddzielone od udostępnionych w systemie Mac OS bibliotek /System/Library/Frameworks/Python.framework i /usr/bin więc dostaję

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

Następnie zainstalowałem ansibli pip install ansible
A potem, kiedy biegnę 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 ansible teraz działa dla mnie, ponieważ biblioteki Python Mac OS nie są przywoływane przez nową instalację.

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


1
2018-03-05 12:11