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:
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'
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 .
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.
- 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-packages
sowie alle Skripte, die /usr/local/bin
fü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:
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 -S
um 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-packages
und verwandten Skripts in zu deinstallieren /usr/local/bin
.
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.py
diese 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 -r
wenn 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 .pth
Dateien. 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/.../Extras
Falls gewünscht, wird auch der Suchpfad weggelassen.
Erstellen Sie eine Datei fix_mac_path.pth
mit 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.pth
an 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.pth
an 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 site
von 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>