Frage Upgrade von setuptools auf OSX El Capitan


Ich versuche, setuptools zu aktualisieren. Naja, eigentlich versuche ich es zu verbessern, aber es versucht setuptools zu aktualisieren und scheitert. Der Versuch, es selbst zu tun, scheitert auch. Selbst der Versuch, es zu deinstallieren, schlägt fehl

$ 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'")]

Ich habe keine Ahnung, was falsch ist. Blick auf alle Dateien in /System/Library/Frameworks/Python.framework/Versions/2.7/ und unter jeder einzelnen Datei gehört root:wheel

Wie kann ich es reparieren?


76
2017-10-20 10:50


Ursprung


Antworten:


Dies geschieht aufgrund des in OS X El Capitan eingeführten Systemintegritätsschutzes.

Hinzufügen --user python zu dem Befehl erlaubt dies zu arbeiten.

Mit anderen Worten

pip install --upgrade setuptools --user python

180
2017-11-13 07:38



Die Antwort ist, dass Sie setuptools auf OSX nicht für das Factory-Python aktualisieren können, das mit dem Betriebssystem ausgeliefert wird. Der Grund ist, dass die Dateien in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python kann vom Benutzer nicht entfernt oder geändert werden. Nicht nur der normale Benutzer, sondern selbst wenn Sie Root-Berechtigungen haben, können Sie diese Dateien nicht ändern.

Sicher können Sie verschiedene andere Methoden verwenden, um eine neuere Version von setuptools zu installieren, aber dies wird das Standardsystempaket nicht überschreiben. Das bedeutet, wenn Sie die vorgeschlagene Route der Verwendung gehen --user python Flag, oder Sie wählen, sie ohne root zu installieren ~/LibraryDiese überschreiben nicht die Version der Systemdateien.

Der Grund, warum Sie oder root die Systemstandardwerte nicht ändern können, liegt an SIP-Berechtigungseinschränkungen in El Capitan +. Sie könnten SIP deaktivieren, dies wird jedoch im Allgemeinen nicht empfohlen.

Stattdessen ist die einzige vernünftige Lösung, einen Python virtualenv zu verwenden.


1
2017-10-10 19:01



Überblick

Das Problem besteht in widersprüchlichen Python-Bibliotheken in Kombination mit dem Systemintegritätsschutz (SIP) unter Mac OS, der die Python-Systembibliotheken schützt.

Die beste Lösung ist meiner Meinung nach, die eigene Python-Installation zu deinstallieren und neu zu installieren und diese getrennt von den Python-Bibliotheken von Mac OS zu halten, die durch SIP geschützt sind.

Ich bevorzuge das, SIP zu deaktivieren, da ich erwarte, dass SIP ein Teil jeder zukünftigen Mac OS-Veröffentlichung ist und SIP ist nicht die Ursache hier, es stellt nur das Problem von in Konflikt stehenden Python-Bibliotheken auf.

Einzelheiten

Ich hatte auch dieses Problem versucht, Ansible zu installieren.

Mein Problem begann, als ich die ansible Installationsanleitung für Mac OS befolgte, die via pip installieren und pip mit installieren soll easy_install wie beschrieben bei Neueste Veröffentlichungen Via Pip

Problem ist bei der Installation von Pip auf diese Weise der easy_install ist das Mac OS zur Verfügung gestellt easy_install beim /usr/bin/easy_install aber es schreibt an die easy-install.pth Datei bei /Library/Python/2.7/site-packages/easy-install.pth und diese Datei verweist auf die von Mac OS bereitgestellten Python-Bibliotheken.

Nachträgliches Installieren von Ansible mit pip install ansible meldet dann, dass die setuptools-Anforderung von der von Mac OS bereitgestellten Python-Bibliothek erfüllt wird /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible benötigt setuptools, spezifiziert aber keine Version. Ein anderes abhängiges Paket, paramiko, benötigt setuptools> = 11.3, aber dies scheint bei der Installation von ansible via pip nicht überprüft zu werden. Wenn Sie versuchen, ansible auszuführen, beklagt es sich, dass die Setup-Tools 1.1.6 sind. Dies ist die Version von setuptools, die mit Mac OS geliefert wird, und ist jetzt durch SIP geschützt, so dass es nicht aktualisiert werden kann.

Anstatt SIP zu deaktivieren, habe ich das Problem behoben, indem ich mein lokales Python wie unter at angegeben, deinstalliert habe https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython und dann erneut herunterladen und installieren.

Wenn Sie über die RM besorgt sind, können Sie stattdessen MV
Zur Deinstallation habe ich es getan

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

Ich habe dann das 2.7.13 Installer-Paket für Mac OS X heruntergeladen https://www.python.org/downloads/ und installiert es.

Dies installierte eine lokale Python und Pip bei /Library/Frameworks/Python.framework/Versions/2.7 und Symlinks in /usr/local/bin sowie vorbereitend /Library/Frameworks/Python.framework/Versions/2.7 zu meinem $ PATH. Dies hält alles von den von Mac OS bereitgestellten Bibliotheken getrennt /System/Library/Frameworks/Python.framework und /usr/bin damit ich es bekomme

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

Ich habe dann ansible mit installiert pip install ansible
Dann wenn ich renne which ansible Ich bekomme

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

und in pip list 

setuptools (28.8.0)
six (1.10.0)

und Ansible funktioniert jetzt für mich, weil die Mac OS Python-Bibliotheken von der neuen Installation nicht referenziert werden.

Beachten Sie, dass wegen der Einstellung $ PATH des Installers which python ist jetzt /Library/Frameworks/Python.framework/Versions/2.7/bin/python und /usr/local/bin/python ist ein symbolischer Link dazu.
Wenn Sie das System Python wollen, müssen Sie / usr / bin / python verwenden oder den $ PATH ändern


1
2018-03-05 12:11