Aktualisieren von Setuptools unter OSX El Capitan

81

Ich versuche, setuptools zu aktualisieren. Nun, eigentlich versuche ich, ansible zu aktualisieren, aber es versucht, setuptools zu aktualisieren und schlägt fehl. Der Versuch, es selbst zu tun, schlägt ebenfalls fehl. 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 nicht die geringste Ahnung, was los ist. Wenn Sie sich alle Dateien in /System/Library/Frameworks/Python.framework/Versions/2.7/und unter jeder einzelnen Datei ansehen, gehört sie jederroot:wheel

Wie kann ich es reparieren?

gman
quelle
2
Ich habe keine Lösung, aber eine Erklärung: Dies liegt wahrscheinlich am neuen Systemintegritätsschutz . pip versucht Dinge zu modifizieren, wo es nicht mehr erlaubt ist, auch mit sudo. Siehe diese Frage . Ich habe mir noch nicht die Zeit genommen, mich damit zu befassen. Die --userOption zu pip ist wahrscheinlich das, worüber ich nachdenken würde. Wenn Sie eine praktische Lösung finden, um alles zu "aktualisieren", teilen Sie diese bitte mit!
Arthur
Ich erhalte einen ipdbFehler, der mit verknüpft ist setuptools. Das Aktualisieren von setuptools funktioniert nicht. Es funktioniert mit --user=python, behebt den ipdb-Fehler jedoch nicht.
R11G

Antworten:

189

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

Durch Hinzufügen --user pythonzum Befehl konnte dies funktionieren.

Mit anderen Worten

pip install --upgrade setuptools --user python
Kof
quelle
2
pip(im Gegensatz zu easy_install) erfordert kein Sudo, da Sie es pythonBenutzer verwenden lassen, habe ich sichergestellt, dass es funktioniert.
Kof
1
Funktioniert auch unter CentOS 7 in einem Docker-Container. Hat aus irgendeinem Grund versagt (obwohl genau das gleiche Setup ohne diesen Schritt vor Mai 2016
funktioniert hat
2
Ich konnte es nicht zum Laufen bringen und verstehe nicht, wie die Option --user funktionieren soll. Was für mich funktioniert hat, war, den Systemintegritätsschutz vorübergehend zu deaktivieren, während setuptools (in Verbindung mit der Installation von ipython) aktualisiert und anschließend wieder aktiviert wurden. Gehen Sie dazu folgendermaßen vor: Starten Sie in den Wiederherstellungsmodus (cmd + R), starten Sie das Terminal und geben Sie ein csrutil disable. Starten Sie den Computer neu und starten Sie ihn nach dem Upgrade im Wiederherstellungsmodus neu csrutil enable. Nach einem Neustart funktionierte ipython für mich weiterhin einwandfrei.
Grav
Ich kann diesen Befehl erfolgreich ausführen, aber es wird keine Aktualisierung vorgenommen. Die Ausgabe sieht folgendermaßen aus: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
Ich konnte endlich die Dinge zum Laufen
diidu
2

Überblick

Das Problem sind widersprüchliche Python-Bibliotheken in Kombination mit System Integrity Protection (SIP) unter Mac OS, das die Python-Systembibliotheken schützt.

Meiner Meinung nach ist die beste Lösung, Ihre eigene Python-Installation zu deinstallieren und neu zu installieren und diese von den von Mac OS bereitgestellten Python-Bibliotheken zu trennen, die durch SIP geschützt sind.

Ich bevorzuge dies, um SIP zu deaktivieren, da ich davon ausgehe, dass SIP Teil zukünftiger Mac OS-Versionen sein wird und SIP hier nicht die Ursache ist, sondern nur das Problem widersprüchlicher Python-Bibliotheken aufdeckt.

Einzelheiten

Ich hatte auch dieses Problem beim Versuch, ansible zu installieren.

Mein Problem begann, als ich die ansiblen Installationsanweisungen für Mac OS befolgte, die über pip installiert und pip mit installiert werden sollen, easy_installwie unter Neueste Versionen über Pip beschrieben

Das Problem ist , wenn auf diese Weise der Installation von Pip, das easy_installist der Mac OS zur Verfügung gestellt easy_installan , /usr/bin/easy_installaber es schreibt in die easy-install.pthDatei auf /Library/Python/2.7/site-packages/easy-install.pthund diese Datei verweist auf die Mac OS zur Verfügung gestellt Python - Bibliotheken.

Die anschließende Installation von ansible mit dem pip install ansibleBericht, dass die Setuptools-Anforderung von Mac OS erfüllt wird, sofern die Python-Bibliothek bei /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible Setuptools erfordert, jedoch keine Version angibt. Ein anderes abhängiges Paket, paramiko, erfordert setuptools> = 11.3, aber dies scheint bei der Installation von ansible via pip nicht überprüft zu werden. Wenn Sie versuchen, ansible auszuführen, wird jedoch beanstandet, dass die Setup-Tools 1.1.6 sind. Dies ist die Version der mit Mac OS bereitgestellten Setuptools, die jetzt durch SIP geschützt ist und daher nicht aktualisiert werden kann.

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

Wenn Sie über die rm besorgt sind, können Sie stattdessen mv
Zum Deinstallieren habe ich 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-Installationspaket für Mac OS X von https://www.python.org/downloads/ heruntergeladen und installiert.

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

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

Ich habe dann ansible installiert mit pip install ansible
Dann , wenn ich laufe which ansibleich get

/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, da die Mac OS Python-Bibliotheken bei der Neuinstallation nicht referenziert werden.

Beachten Sie, dass aufgrund der Installateur $ PATH Einstellung, which pythonist jetzt /Library/Frameworks/Python.framework/Versions/2.7/bin/pythonund /usr/local/bin/pythonist ein symbolischer Link zu diesem.
Wenn Sie das System Python möchten, müssen Sie / usr / bin / python verwenden oder den $ PATH ändern

Jason S.
quelle
1

Die Antwort ist, dass Sie setuptools unter OSX nicht für die werkseitige Python aktualisieren können, die im Lieferumfang des Betriebssystems enthalten ist. Der Grund ist, dass die Dateien /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonnicht vom Benutzer entfernt oder geändert werden können. Nicht nur der normale Benutzer, sondern auch wenn Sie über Root-Berechtigungen verfügen, können Sie diese Dateien nicht ändern.

Natürlich können Sie verschiedene andere Methoden verwenden, um eine neuere Version von setuptools zu installieren, aber dies überschreibt nicht das Standardsystempaket. Das heißt, wenn Sie den vorgeschlagenen Verwendungsweg für das --user pythonFlag wählen oder diese ohne Root installieren ~/Library, wird die Version der Systemdateien nicht überschrieben.

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

Stattdessen ist die einzig vernünftige Lösung die Verwendung einer virtuellen Python-Umgebung.

ICH K
quelle