Wie verwende ich pip nach dem OS X El Capitan-Upgrade?

116

Nach dem El Capitan-Update kann ich die Pip-Installation nicht mehr ausführen. Der Fehler, den ich bekomme, ist, dass der Vorgang nicht zulässig ist, wenn pip versucht, während der Installation neue Ordner zu erstellen.

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

Im Allgemeinen kann ich in diesen Ordnern keine Ordner usw. erstellen. Habe versucht, sudo zu verwenden, was nicht hilft. Auch das habe ich getan

sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/

Das oben Genannte hat auch nicht geholfen. Was kann ich tun, um Python-Bibliotheken wieder reibungslos zu installieren?

web_ninja
quelle
1
Wo ist Pip auf Ihrem System?
user151019
$ where pip / usr / local / bin / pip
web_ninja
$ pip --version pip 7.1.2 von /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)
web_ninja
Wie hast du pip installiert - es sollte nicht nach /Library/Python/2.7/site-packages schreiben / System
user151019 06.10.15
Ich erinnere mich jetzt nicht. Nachdem ich den Kommentar veröffentlicht hatte, stellte ich fest, dass dies das Problem war, und verwendete brew, um Python zu installieren. Dadurch wurde die Position von pip korrigiert.
web_ninja

Antworten:

84

Eine schnelle Lösung ist die Verwendung Homebrew installieren pythonin /usr/local/binso dass Ihr pipgegen einen vom Benutzer modifizierbar Python - Framework ausführen können.

brew install python
pip --version

Das Deaktivieren des Systemintegritätsschutzes ist ebenfalls eine Option. Ich empfehle dies jedoch nur für professionell verwaltete und Firewall-fähige Server, bei denen Sie die Möglichkeit haben, die Intrusion Detection zu verwalten, oder wenn Sie Entwickler / Systemadministrator sind und Dinge mit und ohne testen müssen SCHLUCK.

ls -lO /System/Library/Frameworks/Python.framework/Versions/2.7/
csrutil status

Sie werden sehen, dass das eingeschränkte Flag gesetzt ist, das nicht einmal als Root entfernt werden kann, während SIP besetzt ist.

Die Verwendung von Homebrew ermöglicht es, Pip und Python getrennt von der vom System bereitgestellten Version zu verwalten. Als Bonus wurde das Homebrew-Framework entwickelt, um Wartung und Patches / Aufgaben über Automatisierung zu vereinfachen.

bmike
quelle
1
Die
gebrühte
@jayatubi Welches Paket oder Skript ist für Sie instabil? Installieren Sie Python 2.7.10 von Brew oder Python3, das gerade eine große Beule bekommen hat und dafür bekannt ist, dass es nicht so abwärtskompatibel ist? Sie können aus Dutzenden von Versionen auswählen, wenn Sie eine bevorzugen, die mehr oder weniger stabil für Ihre Anforderungen ist.
bmike
1
Einig , dass brew install pythonist die einfachste Option, obwohl eine andere Setup - Reinigung erforderlich sein, wenn Sie schon seit einiger Zeit das System Python wurde (zB root eigenen Python - Dateien unter /usr/local/binund ~/Library/Caches/pip)
RichVel
Das Herunterladen einer kompilierten Python-.pkg-Datei von zB python.org/downloads/release/python-2712 funktioniert unter 10.8 einwandfrei . Irgendwelche Kommentare dazu vs. Homebrew? Danke
Denis
Ich mag @denis, brewda es einfach ist, eine Version zu pinnen, die Sie mögen - verwalten Sie mehrere verschiedene Versionen oder halten Sie die Dinge regelmäßig auf dem neuesten Stand. Wenn Sie jedoch etwas haben, das für Sie funktioniert - es ist schwer zu argumentieren, dass Sie etwas ändern sollten.
bmike
77

Eine weitere praktikable Option, ohne SIP deaktivieren oder andere Python-Versionen installieren zu müssen, ist die Installation der Module nur für den aktuellen Benutzer

pip install --user <modulename>

Wenn es nur Ihre persönliche Maschine ist, wäre dies die einfachste und sicherste Lösung.

Michal Příhoda
quelle
1
Vielleicht hat El Capitan / usr / bin / pip bereitgestellt, aber macOS Sierra nicht.
Sigjuice
1
Arbeitet an Sierra
Harryparkdotio
57

Dieses Problem tritt häufig auf, wenn pip versucht, eine Manpage für IPython auf El Capitan zu installieren. Die schnelle Lösung besteht darin, einen Pip-Befehl wie folgt zu verwenden:

sudo -H pip install --install-option '--install-data=/usr/local' <package>

Der Systemintegritätsschutz (SIP) auf El Capitan blockiert jedoch einige schlechte Praktiken mit Pip, die früher vorbeigingen. Daher müssen Sie wahrscheinlich weitere Änderungen vornehmen, damit Pip auf El Capitan reibungslos funktioniert.

SIP auf El Capitan zeigt drei Probleme bei der Verwendung von pip mit der von Apple bereitgestellten Version von Python unter OS X:

  1. distutils setzt zwei wichtige Variablen auf Macs nicht korrekt, daher versucht pip, Header und andere gemeinsam genutzte Dateien (z. B. Hilfeseiten) darunter zu schreiben /System/Library/Frameworks/Python.framework/Versions/2.7/. Dies ist eine schlechte Idee, aber in früheren Versionen von OS X war dies erfolgreich, wenn pip mit sudo ausgeführt wurde. Auf El Capitan scheitert es jedoch an SIP. Dies ist der Fehler, auf den Sie gestoßen sind. Es gibt Nachrichten wieOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple installiert veraltete Versionen einiger Pakete in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/(z. B. sechs). Wenn Sie in früheren Versionen von OS X ein Paket installiert haben, für das eine neuere Version erforderlich war sudo pip, wurde die alte Version stillschweigend aus dem /System/Ordner entfernt und eine neuere Version in installiert /Library/Python/2.7/site-packages. Das war auch eine schlechte Idee und ist mit SIP nicht mehr möglich. Aber jetzt wird pip mit einer Fehlermeldung abstürzen, während versucht wird, das alte Paket zu entfernen. Diese Nachricht ist auch OSError: [Errno: 1], aber es kommt nach einer Nachricht wie Uninstalling six-1.4.1:. Siehe z . B. https://github.com/pypa/pip/issues/3165 .

  3. Die Apple-Version von Python fügt /System/Library/Frameworks/Python.framework/Versions/2.7/dem Python-Suchpfad mehrere Verzeichnisse über den Standardinstallationspfaden für Pakete hinzu, auf die der Benutzer zugreifen kann. Wenn Sie also eine neuere Version eines Pakets an einer anderen Stelle installieren (z. B. sudo -H pip install --ignore-installed six), erhalten Sie eine Meldung, dass die Installation erfolgreich war. Wenn Sie jedoch Python ausführen, erhalten Sie die ältere Version von /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/. Dies macht es auch unmöglich, neue Pakete mit demselben Namen wie Module aus der Standardbibliothek zu verwenden.

Sie können diese Probleme umgehen, die Methode hängt jedoch von Ihren Antworten auf drei Fragen ab.

  1. Möchten Sie die Mac OS X-Version von Python weiterhin verwenden oder Ihre eigene installieren? Die Installation Ihrer eigenen Software ist die sicherste Option und kann über das offizielle Python-Installationsprogramm Homebrew oder Anaconda erfolgen. Dies empfiehlt auch Apple , wie von @Sacrilicious hervorgehoben . Wenn Sie Ihre eigene Version von Python installieren, sollten Sie wahrscheinlich alles deinstallieren, was derzeit in Python installiert ist, /Library/Python/2.7/site-packagessowie alle Skripte, die /usr/local/binfür diese Pakete installiert wurden (einschließlich pip). Andernfalls haben Sie die lästige Erfahrung, dass einige Skripte auf die vom System installierte Version von Python und andere auf Ihre eigene Installation zugreifen.

Wenn Sie sich an das vom System installierte Python halten möchten, müssen Sie zwei weitere Entscheidungen treffen:

  1. Möchten Sie Pakete für alle Benutzer oder nur für sich selbst installieren? Durch die Installation für alle Benutzer wird sichergestellt, dass jedes Programm, das Python verwendet (einschließlich möglicherweise administrativer Skripts), auf alle von Ihnen installierten Pakete zugreifen kann. Es besteht jedoch die entfernte Möglichkeit, dass es El Capitans eigenen Gebrauch von Python stört. (Ich hoffe, dass Apple verwendet, python -Sum sicherzustellen, dass sie immer die Pakete erhalten, die sie erwarten, aber ich habe keine Möglichkeit, dies zu testen.) Die Installation nur für Ihr eigenes Benutzerkonto beseitigt die Möglichkeit, die System-Python-Installation zu stören. Hinweis: Wenn Sie von der systemweiten Installation zu einer reinen Benutzerinstallation wechseln, sollten Sie diese Gelegenheit wahrscheinlich nutzen, um alle aktuell installierten /Library/Python/2.7/site-packagesund verwandten Skripts in zu deinstallieren /usr/local/bin.

  2. Möchten Sie die zusätzlichen Pakete, die mit der OS X-Version von Python (unter /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/) installiert wurden, ausblenden oder im Suchpfad belassen? Ich empfehle, sie auszublenden, damit die neuesten Versionen dieser Pakete bei Bedarf automatisch an vom Benutzer zugänglichen Speicherorten installiert werden. Wenn Sie dieses Verzeichnis nicht verbergen, erhalten Sie gelegentlich Meldungen, dass pip ein vorhandenes Paket nicht entfernen konnte, um es auf eine spätere Version zu aktualisieren (erforderlich für ein anderes Paket, das Sie installieren). In diesem Fall müssen Sie ausführen pip install --ignore-installed <package>, wodurch die neuere Version installiert und die vom System installierte Version ausgeblendet wird. Wenn Sie jedoch das Ganze verstecken/System/.../Extras/...In diesem Verzeichnis verlieren Sie den Zugriff auf einige Apple-Pakete, die nicht über pip verfügbar sind, z. B. CoreGraphics und bonjour. (Wenn Sie diese benötigen, können Sie möglicherweise auf sie zugreifen, indem Sie sie mit einem Symbol in Ihrem Site-Package-Verzeichnis verknüpfen.)

Hier sind die Problemumgehungen. Dies ist eine gute Vorgehensweise für alle Versionen von OS X, um zu vermeiden, dass vom Betriebssystem verwendete Python-Pakete versehentlich ersetzt oder entfernt werden. Sie sind jedoch unerlässlich, wenn Sie vom Benutzer installierte Pakete mit der von Apple bereitgestellten Version von Python unter OS X El Capitan (10.11) verwenden möchten.

Pip installieren

Sie haben dies wahrscheinlich bereits getan, aber wenn nicht, können Sie den folgenden Befehl verwenden, um pip für alle Benutzer zu installieren :

sudo -H easy_install pip
# pip script will be installed in /usr/local/bin

Oder verwenden Sie diesen Befehl, um pip nur für Ihr eigenes Benutzerkonto zu installieren :

easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin

Freigegebene Dateispeicherorte verwalten

Wenn Sie Pakete für alle Benutzer installieren, erstellen Sie eine Datei mit dem Namen .pydistutils.cfg mit diesen Zeilen (von https://github.com/pypa/pip/issues/426 ):

[install]
install-data=/usr/local
install-headers=/usr/local

Wenn Sie normalerweise verwenden sudo -H pip ..., sollten Sie diese Datei in /var/root(Basisverzeichnis für den Root-Benutzer) ablegen. Wenn Sie normalerweise verwenden sudo pip ..., sollten Sie diese Datei in Ihr eigenes Ausgangsverzeichnis (~) stellen.

Diese Einstellungen verhindern, dass Pip versucht, freigegebene Elemente wie Header und Hilfeseiten darunter zu schreiben /Library/System. (Der Befehl oben in dieser Antwort ist eine schnellere Version derselben Sache.) Diese Einstellungen sind erforderlich, da darwin-spezifischer Code /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.pydiese Variablen nicht auf root-schreibbare Speicherorte setzt (obwohl er andere Variablen korrekt setzt). Weitere Informationen hierzu finden Sie unter https://github.com/pypa/pip/issues/3177 .

Wenn Sie Pakete nur für Ihr eigenes Benutzerkonto installieren, werden freigegebene Elemente automatisch unter installiert ~/Library/Python/2.7/. Sie sollten jedoch die folgenden Zeilen zu Ihrem ~ / .profile hinzufügen, damit die freigegebenen Elemente bei Bedarf gefunden werden:

export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH

Hinweis: Sie müssen eine neue Shell starten oder diese in der Befehlszeile ausführen, damit die Änderungen wirksam werden. Möglicherweise möchten Sie auch ausführen, hash -rwenn Sie kürzlich alte Skripts aus dem Pfad entfernt haben.

Python-Pfad verwalten

Sie müssen sicherstellen, dass die von Ihnen installierten Pakete in der Suchreihenfolge von Python höher sind als die vom System installierten Pakete. Am einfachsten geht das mit .pthDateien. Dies folgt dem Vorschlag von @ Sacrilicious an anderer Stelle auf dieser Seite , stellt jedoch sicher, dass Ihr Site- Package- Benutzerverzeichnis vor Ihrem systemweiten Site-Package-Verzeichnis durchsucht wird. Beide werden vor der Standardbibliothek und dem Extras-Verzeichnis von Apple (beide unter / System /) durchsucht. ..). /System/.../ExtrasFalls gewünscht, wird auch der Suchpfad weggelassen.

Erstellen Sie eine Datei fix_mac_path.pthmit dem Namen und dem folgenden Text. Wenn Sie Pakete für alle Benutzer installieren, fix_mac_path.pth sollte in platziert werden /Library/Python/2.7/site-packages. Wenn Sie nur für Ihren eigenen Benutzer installieren, fix_mac_path.pth sollten Sie sich in ~ / Library / Python / 2.7 / lib / python / site-packages befinden. (Diese Datei kann einen beliebigen Namen haben, muss sich jedoch an einer oder beiden dieser Stellen befinden und mit enden .pth. Außerdem muss sich der gesamte Text in dieser Datei in einer Zeile befinden.)

Wenn Sie die von Apple installierten Pakete ausblenden möchten, gehen Sie wie folgt vor /System/.../Extras:

Führen Sie zunächst einen der folgenden Befehle aus, um eine Arbeitskopie von pip / setuptools zu erhalten, die von der von Apple gelieferten Version unabhängig ist:

pip install --ignore-installed --user setuptools   # your account only
# or
sudo -H pip install --ignore-installed setuptools  # all users

Geben Sie dann den folgenden Code fix_mac_path.pthan der oben angegebenen Stelle ein:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

Wenn Sie die von Apple installierten Pakete weiterhin verwenden möchten, müssen Sie keine weitere Kopie von setuptools installieren. Geben Sie einfach den folgenden Code fix_mac_path.pthan der oben angegebenen Stelle ein:

import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths

Anschließend können Sie mithilfe python -m sitevon sicherstellen, dass die Pfadsuchreihenfolge sinnvoll ist.

Installieren Sie Pakete

Danach sollten Sie in der Lage sein, neue Pakete mit einem der folgenden Befehle zu installieren.

Für alle Benutzer:

sudo -H pip install <package>

Für Ihren eigenen Benutzer:

pip install --user <package>
Matthias Fripp
quelle
Sehr klare Anweisungen mit Alternativen. Ich folgte dieser Anleitung und konnte das Problem mit der Bibliothek "6" erfolgreich überwinden, sodass ich mitmproxy installieren konnte.
Paul Chernoch
1
Dies ist wirklich eine der informativsten, vollständigsten und hilfreichsten Antworten, die ich je beim Stackoverflow erhalten habe. Gut gemacht und danke.
cmsjr
@ cmsjr, danke! Es hat eine Weile gedauert, bis ich herausgefunden habe, was los war, und das gibt mir einen guten Ort, um darauf zurückzugreifen!
Matthias Fripp
4
Die mit Abstand klarste und vollständigste Erklärung, die ich für diesen Bereich gesehen habe, insbesondere die Bereinigung des vorhandenen Systems Python-Chaos - danke! Meine Hauptverbesserung wäre die Verwendung eines Pythons, auf dem Brew installiert ist, da dies sehr einfach ist und ein sauberes Setup bietet, das kein Sudo erfordert. Dies ist zusätzlich zu Virtualenvs für Entwicklungsprojekte.
RichVel
Was für eine Katastrophe. Gott segne dich.
Matt M.
31

Erstens deaktivieren Sie SIP nicht, um das Problem zu beheben. Entschuldigung, das ist der Grund, warum diese Ordnererstellung fehlschlägt, aber wir müssen es umgehen. Zweitens verlieren Sie alle Feinheiten, die Apple Ihnen gegeben hat, wie eine Brücke über pyObjC, wenn Sie Ihren eigenen Python installieren.
(Ich gebe zu, sie sagen, Sie sollten Ihre eigene installieren, /usr/localwenn Sie ein Entwickler sind, ich habe nur Einwände dagegen, es auf einfache Weise mit Brew zu tun .)

Logischerweise würden Sie denken, es irgendwo zu installieren, wo SIP Sie nicht blockiert, und dies ist mit ziemlicher Sicherheit eine Abhängigkeit, die Pip für Sie auflöst. Es ist nicht das Mittel, Pip mitzuteilen, wo Sie Installationen durchführen möchten, sondern das bereits vorhandene Zeug in / System zu ignorieren. Dort wird nach Abhängigkeiten für viele häufig benötigte Installationen gesucht, z. B. sixund SIP verursacht Pip sich zu brechen, wenn es geht, um zu versuchen, es zu aktualisieren. Eigentlich ist es Pip 'Standardverhalten, auf /Library/Python/2.7/site-packages zu installieren. Sie müssen nur sagen --ignore-installed, dass er die Installation aktualisierter Versionen von Abhängigkeiten erzwingen soll.
... Leider können Sie dieses Modul dann in einer interaktiven Sitzung oder einem interaktiven Skript importieren und sehen, dass es zu netten Fehlern kommt. Das nicht aktualisierte Paket von / System wird noch geprüft!

Python bietet seit den Anfängen von setuptools die Möglichkeit, diese Suche explizit zu gestalten. Es sieht ein bisschen seltsam aus (und sollte diejenigen von uns anhalten, die sicherheitsbewusst sind und sich nicht über die Stumpfheit freuen, es an die Spitze der Liste zu schieben, ohne es zu überprüfen). Sie können eine Datei platzieren, die mit .pth( endet . zB 'elcap.pth') in /Library/Python/2.7/site-packages, um dieses Verzeichnis mit folgendem Inhalt an den Anfang der Suchreihenfolge zu verschieben :
import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

Starten Sie eine neue Sitzung, und python -m sitebestätigen Sie durch eine kurze Fahrt, dass Sie diesen Pfad in den ersten Steckplatz eingefügt haben, und das Importieren von Modulen sollte funktionieren.

Oh, und nach all dem versuchen Sie es einfach mit Pip's --userOption oder mit einem virtuellen Env - das ist sowieso die beste Praxis für die meisten Leute.

Sacrilicious
quelle
1
Das ist nun elegant und ein guter Kontrapunkt zu meiner simplen "Verlassen Sie das System Python und brauen Sie es" -Lösung. Wenn Sie schnell und schmutzig sein müssen, ist dies möglicherweise nicht die Mühe wert, aber das Beibehalten von pyObjC und einer Python hat große Vorteile.
bmike
2
Pythonischer und sinnvoller wäre es, --usereine virtuelle Umgebung zu installieren oder zu verwenden. Ich bin nur der Meinung, als Sysadmin, dass Sie einmal für ein System installieren und dass der Benutzer in der Lage sein sollte, das System zu überschreiben. Die Einwände gegen diese Lösung könnten sein, dass das System einen geänderten Pfad betrachten würde, aber es gibt den Präzedenzfall, dass easy_install auch eine .pth-Datei schreiben kann.
Sacrilicious
2
Ich weiß nicht, ob der Brauweg der einfache / falsche Weg ist - es geht darum, Probleme zu lösen, und das Brauen löst meine Probleme auf spektakuläre Weise - wenn ich mir nur überlege, wie viel Mühe es kosten würde, mit den neuen Spielsachen zu spielen (Ruby 2.2 .3, python3.5, MongoDB, Node4.2.1) auf eine bequeme Art und Weise, wie das Eingeben eines Befehls und das erneute Kompilieren, Aktualisieren und Herausnehmen des Thrashs - na ja, dann gehe ich den einfachen Weg :) Ich weiß nicht, was Die ausgelieferte OS X-Version von Python ist so unterschiedlich, abgesehen von der Cocoa and Threads-Unterstützung und vielen Paketen, die ich noch nie zuvor verwendet habe, und ich habe tatsächlich meinen Stapel mit Xcode / Kernel-Zeug kompiliert
PJJ
Ich habe elcap.pth zu /Library/Python/2.7/site-packages hinzugefügt und sehe jetzt den Pfad, der in den Indizes 0 und 2 von sys.path aufgeführt ist. Dann habe ich versucht, sudo pip install --ignore-installed ipythonund es läuft, bis "Ausführen von setup.py install for pexpect", an welchem ​​Punkt pip noch versucht, etwas in /System/Library/Frameworks/Python.framework/Versions/2.7/share zu aktualisieren, und Fehler aus.
Kojiro
Die Installation von virtualenv erfordert die Verwendung von pip, sodass Probleme im Zusammenhang mit der Verwendung von pip nicht wirklich behoben werden. Wie es ist, installiere ich es mit pip --userund virtualenv funktioniert immer noch nicht.
user5359531
4

Ich denke, es liegt am SIP- oder Systemintegritätsschutz , einer Art Echtzeit-Dateischutz, der sich wie ein Windows-Antivirus anfühlt :) und alle Änderungen stoppt, die Sie in den OS X-Systemordnern vornehmen möchten. Apple hat sich einfach dazu entschlossen, Systemänderungen zu deaktivieren - um sicherzugehen, dass Sie vollständig vor dem Bösen des Internets und anderen rechnerbedingten bösen Mächten geschützt sind, vor denen SIP uns schützt.

Wenn Sie SIP deaktivieren möchten, müssen Sie Recovery HD starten, indem Sie beim Starten Ihres Mac gleichzeitig die Tastenkombination Befehlstaste + R gedrückt halten.

Öffnen Sie das Terminal über das Menü Dienstprogramme, geben Sie es ein und csrutil disabledrücken Sie die Eingabetaste. Öffnen Sie das Apple-Menü, um den Computer neu zu starten.

SIP wäre ab sofort deaktiviert. Ich habe es vor langer Zeit deaktiviert und habe nichts Falsches bemerkt. Einige Prozesse scheinen sich zu beschweren, aber sie funktionieren immer unter OS X, daher bin ich mir nicht sicher, ob dies auf den fehlenden Schutz der Systemintegrität zurückzuführen ist.

Mein Tipp ist, SIP vollständig loszuwerden und / oder Homebrew für Ihre gesamte OpenSource- / Entwicklungssoftware zu verwenden. Homebrew verwendet das Verzeichnis / usr / local für die Installation und kollidiert nicht mit anderen Systemkomponenten. Homebrew- Builds sind aktueller als die OS X Apple-Builds.

PJJ
quelle
1
Es macht keinen Sinn, diese Antwort abzustimmen. Aber vielleicht ist jemand nur launisch? +1 von mir ...
bmike
1
Danke Kumpel! Versucht, etwas Humor zu setzen, aber nicht jeder muss mit meinem Verständnis davon ausgerichtet sein;)
PJJ
Hmm - nachdem ich die Antwort von sacrilicious gelesen habe , bin ich mir nicht so sicher, ob dies SIP ist. Gedanken?
bmike
1
Dies ist in der Tat SIP, das die Erstellung eines Ordners (möglicherweise für eine Manpage) als Unterverzeichnis von verhindert /System. gesperrt ab 10.11. Wir können csrutil verwenden, um es vorübergehend zu deaktivieren, wenn wir uns in einer Notlage befinden, obwohl ich weiß, dass das Gefühl haben könnte, es könnte sich in einen Schlag ins Maul verwandeln, aber dies scheint kein guter Grund zu sein, es zu verwenden. Verlassen sie weg ist ... warum wir nette Sachen nicht haben können.
Sacrilicious
Ich habe es die ganze Zeit ausgeschaltet: 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 und keinen Grund, es zu aktivieren, da ich mein System ziemlich dicht geschlossen und angepasst habe
PJJ
4

Verwendet pip3 install <package>statt und löste das Problem mit den Berechtigungen in pip.

Keng
quelle
4

Glauben Sie mir, Sie wollen nicht, dass die Bibliothek irgendetwas auf diesen Pfad schreibt.

Früher wurde es nicht empfohlen, aber es ist möglich, in es zu schreiben /System/Library/Frameworks/Python.framework/Versions/2.7/, aber jetzt wird es aufgrund von Apple SIP nicht unterstützt und daher ist es das Problem des Bibliotheksbesitzers. Die Paketverteilung sollte aktualisiert werden, damit sie mit diesem Update ordnungsgemäß funktioniert. Die meisten Pakete wurden aktualisiert und installieren ihren Inhalt in /Library/Python/2.7/site-packages, aber einige Pakete wurden nicht aktualisiert.

In meinem Fall war es eine Greenlet-Bibliothek, die versuchte, ihre .hDatei in den System Frameworks-Ordner zu schreiben :

Wie man es behebt: sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/" dannsudo -H pip install gevent

Für Numpy ist das Update sudo -H pip install --ignore-installed -U numpy.

Für andere Bibliotheken variieren die Fixes von https://github.com/pypa/pip/issues/3177 bis pip install --ignore-installed sixund pip install --user(letzteres installiert alles in /User//Library/Python/2.7/ path). Siehe auch die aktuelle Top-Antwort auf diesen Beitrag: https://apple.stackexchange.com/a/210021/169157

Wenn Sie geben python -m sitesollte umfassen sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] vor Systempfade - das ist , warum (und wie) es funktioniert.

Yuri Baburov
quelle
3

Ich habe es wie folgt gemacht:

brew install python

dann nach der Installation von Python:

sudo easy_install pip
Bewegungstrank
quelle
3
brew install pythoninstalliert pip schon damit. Wenn Sie pip dann über easy_install installieren, werden Sie wahrscheinlich mit zwei Installationen von pip enden, was zu verwirrenden Problemen führen kann.
NSSynapse
3

Eine sehr coole Lösung für dieses Problem ist die Verwendung von virtualenv (virtualenvwrapper). Nachdem Sie eine neue Umgebung für Ihr Projekt erstellt haben, können Sie pip ohne Probleme verwenden. Daher habe ich virtualenvwrapper verwendet und diese beiden Zeilen beheben das Problem:

mkproject <project_name>
pip install <package_name>
neosergio
quelle
Wie empfehlen Sie die Installation von virtualenv? pip install virtualenvoder Pip funktioniert nicht und Sie müssen auf sudo easy_install+1 zurückgreifen, um festzustellen, was bereits vorhanden ist. Cheers
bmike
1
pip funktioniert nicht aufgrund von Berechtigungen Problem, so sudo easy_installfunktioniert
neosergio
2

Ich habe Python3 auf meinem Mac installiert, während das ursprüngliche Python2.7 mit OSX geliefert wird. Wenn ich also python3 aufrufen möchte, gebe ich einfach $ python3 ein. Vielleicht solltest du $ python3 get-pip.py ausprobieren, das funktioniert bei mir, wenn ich fast das gleiche Problem mit dir habe.

dynamitez
quelle
2

Zusammenfassung

Ich habe dieses Problem unter Mac OS X 10.11.6 (mit SIP) festgestellt, weil ich pip mit System easy_install installiert habe und die lokale Datei easy-install.pth auf Systembibliotheken verweist.
Bei der Installation nachfolgender Pakete mit pip wurden einige der Abhängigkeiten in die älteren System Python-Bibliotheken aufgelöst.
Die Lösung bestand darin, meine lokal installierten Bibliotheken zu entfernen und eine lokale Python-Version (einschließlich pip) von https://www.python.org/downloads/ neu zu installieren, damit das System und die lokal installierten Python-Instanzen getrennt bleiben.
Ich hatte versucht, den Fix fix_mac_path.pth in der Antwort von @mfripp zu verwenden, fand jedoch heraus, dass ich Cleaner entfernte und neu installierte.

Ursache

(Befolgen Sie diese Schritte nicht)

Ich bin auf dieses Problem gestoßen, als ich versucht habe, Ansible zu installieren. Ich habe die Ansible-Dokumentation für die Installation unter OS X über pip befolgt.
Zuerst habe ich pip mit installiert. sudo easy_install pip
Dabei wurde das System easy_install unter /usr/bin/easy_installund pip mit installiert. /Library/Python/2.7/site-packages/pip
Bei der Installation von pip wurden die folgenden Warnungen angezeigt , aber ich habe sie ignoriert und blindlings weitergepflügt.

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'python_requires'
  warnings.warn(msg)
warning: no previously-included files found matching '.coveragerc'
...
Adding pip 9.0.1 to easy-install.pth file
Installing pip script to /usr/local/bin
...
Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg
...
Finished processing dependencies for pip

Später sah /Library/Python/2.7/site-packages/easy-install.pthes so aus

import sys; sys.__plen = len(sys.path)
./pip-9.0.1-py2.7.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

Dann habe ich ansible via pip installiert

sudo pip install ansible

Ich erhielt die Nachricht, dass die Anforderungen bereits von Systembibliotheken erfüllt wurden

Requirement already satisfied: setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from ansible)  
Requirement already satisfied: six>=1.4.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from cryptography>=1.1->paramiko->ansible)

Dann habe ich beim laufen ansible dieses Problem bekommen

VersionConflict: (setuptools 1.1.6 (/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python), Requirement.parse('setuptools>=11.3'))

und ein Pip-Check ergab, dass paramiko ein neueres Setuptool benötigte

pip check paramiko
matplotlib 1.3.1 requires tornado, which is not installed.
matplotlib 1.3.1 requires nose, which is not installed.
cryptography 1.7.2 has requirement setuptools>=11.3, but you have setuptools 1.1.6.

Beachten Sie, dass ansible nur benötigte setuptools (keine Version) und so pip die von den System setuptools erfüllte Abhängigkeit meldet.

Lösung

Ich beschloss , es durch alle lokalen Python - Bibliotheken zu deinstallieren , den Prozess angedeutet mit https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Für mich beteiligt

sudo rm -rf /Library/Python

Dann entfernte ich die Symlinks und ausführbaren Dateien in / usr / local / bin wie

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*

und so weiter. Ich habe auch alle Anwendungen entfernt

sudo rm -rf /Applications/Python\ 2.7/

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

Dies installierte ein lokales Python und Pip an /Library/Frameworks/Python.framework/Versions/2.7und Symlinks, in /usr/local/bindenen von den Systembibliotheken an /System/Library/Frameworks/Python.frameworkund /usr/bin so, dass ich bekommen ist

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

und in pip list

setuptools (28.8.0)
six (1.10.0)

Ansible funktioniert jetzt bei mir

Jason S
quelle
1

Für mich war der PATHverschwunden pip, dies wurde durch Laufen bestätigtpython -m pip

Zwei mögliche Lösungen hier, addieren sie pipwieder zu PATH. In meinem Fall pipwar es sowieso nicht mehr aktuell, daher wurde das Problem durch ein Upgrade behoben:

python -m pip install --upgrade pip

✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)

Vinnie James
quelle