116 votes

Comment utiliser pip après la mise à jour d'OS X El Capitan ?

Après la mise à jour d'El Capitan, je suis incapable d'exécuter pip install. L'erreur que j'obtiens est que "l'opération n'est pas autorisée" lorsque pip essaie de créer de nouveaux dossiers pendant l'installation.

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

En fait, en général, je ne peux pas créer de dossiers, etc. dans ces dossiers. J'ai essayé d'utiliser sudo, mais cela ne m'a pas aidé. J'ai également fait

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

Ce qui précède n'a pas aidé non plus. Que puis-je faire pour pouvoir à nouveau installer les bibliothèques Python sans problème ?

1 votes

Où se trouve pip sur votre système ?

0 votes

$ where pip /usr/local/bin/pip

0 votes

$ pip --version pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (Python 2.7)

86voto

Oskar Points 1242

Une solution rapide consiste à utiliser homebrew pour installer python en /usr/local/bin afin que votre pip peut s'exécuter contre un cadre Python modifiable par l'utilisateur.

brew install python
pip --version

Désactivation de la protection de l'intégrité du système est également une option, mais je ne la recommande que pour les serveurs gérés professionnellement et protégés par un pare-feu, où vous avez la main d'œuvre nécessaire pour gérer la détection des intrusions, ou si vous êtes un développeur/administrateur système et que vous avez besoin de tester des choses avec et sans SIP.

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

Vous verrez que le restreint est activé et ne peut être supprimé, même en tant que Root, lorsque le SIP est engagé.

L'utilisation de homebrew permet de gérer pip et Python séparément de la version fournie par le système. En prime, le framework homebrew est conçu pour faciliter la maintenance et les patchs/chores via l'automatisation.

1 votes

Le Python installé par Brew n'est pas stable et se bloque de manière aléatoire.

0 votes

@jayatubi Quel paquet ou script est instable pour vous ? Est-ce que vous installez Python 2.7.10 de brew ou python3 qui vient d'obtenir un bump majeur et qui est connu pour ne pas être aussi rétrocompatible. Vous pouvez choisir parmi des dizaines de versions si vous préférez une version plus ou moins stable pour vos besoins.

1 votes

Convenez que brew install python est l'option la plus simple, bien que le nettoyage de certaines autres configurations puisse être nécessaire si vous utilisez le système Python depuis un certain temps (par exemple, des fichiers Python appartenant à Root sous /usr/local/bin y ~/Library/Caches/pip )

76voto

Michal Příhoda Points 881

Une autre option viable, sans avoir besoin de désactiver SIP ou d'installer d'autres versions de Python, est d'installer les modules uniquement pour l'utilisateur actuel en utilisant

pip install --user <modulename>

S'il ne s'agit que de votre machine personnelle, c'est la solution la plus simple et la plus sûre.

1 votes

El Capitan a peut-être fourni /usr/bin/pip, mais pas MacOS Sierra.

1 votes

Fonctionne sur sierra

58voto

Matthias Fripp Points 946

Ce problème survient souvent lorsque pip essaie d'installer une page de manuel pour IPython sur El Capitan. La solution rapide est d'utiliser une commande pip comme celle-ci :

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

Cependant, la protection de l'intégrité du système (SIP) sur El Capitan bloque plusieurs mauvaises pratiques avec pip qui avaient l'habitude de se faufiler, donc vous aurez probablement besoin de faire quelques changements supplémentaires pour que pip fonctionne sans problème sur El Capitan.

SIP sur El Capitan expose trois problèmes liés à l'utilisation de pip avec la version de Python fournie par Apple sur OS X :

  1. distutils ne définit pas correctement deux variables importantes sur les Macs, aussi pip essaie-t-il d'écrire les en-têtes et autres fichiers partagés (par exemple, les pages de manuel) sous le nom de /System/Library/Frameworks/Python.framework/Versions/2.7/ . C'est une mauvaise idée, mais dans les versions précédentes d'OS X, cela réussissait si pip était lancé avec sudo. Cependant, elle échoue sur El Capitan à cause de SIP. C'est l'erreur que vous avez rencontrée. Il donne des messages comme OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple installe des versions périmées de certains paquets dans /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/ (par exemple, six). Sur les versions précédentes d'OS X, lorsque vous installiez un paquet qui nécessitait une version plus récente de l'un d'entre eux, sudo pip supprimerait silencieusement l'ancienne version du /System/ et installer une version plus récente dans /Library/Python/2.7/site-packages . C'était aussi une mauvaise idée, et ce n'est plus possible avec SIP. Mais maintenant, pip va se planter avec un message d'erreur en essayant de supprimer l'ancien paquet. Ce message est également OSError: [Errno: 1] mais il vient après un message comme Uninstalling six-1.4.1: . Voir, par exemple, https://github.com/pypa/pip/issues/3165 .

  3. La version Apple de Python ajoute plusieurs répertoires sous le nom de /System/Library/Frameworks/Python.framework/Versions/2.7/ au chemin de recherche Python au-dessus de les emplacements standard d'installation des paquets accessibles à l'utilisateur. Ainsi, si vous installez une version plus récente d'un paquet ailleurs (par ex, sudo -H pip install --ignore-installed six ), vous obtiendrez un message indiquant que l'installation a réussi, mais ensuite, lorsque vous lancerez Python, vous obtiendrez l'ancienne version de /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/ . Cela rend également impossible l'utilisation de nouveaux paquets qui portent le même nom que des modules de la bibliothèque standard.

Vous pouvez contourner ces problèmes, mais la méthode dépend de vos réponses à trois questions.

  1. Voulez-vous continuer à utiliser la version Mac OS X de Python ou installer la vôtre ? Installer votre propre programme est l'option la plus sûre, et peut être fait via l'installateur officiel de Python, Homebrew ou Anaconda. C'est également ce que Apple recommande comme signalé par @Sacrilicious . Si vous installez votre propre version de Python, vous devriez probablement désinstaller tout ce qui est actuellement installé dans le répertoire /Library/Python/2.7/site-packages et tous les scripts qui ont été installés en /usr/local/bin pour ces paquets (y compris pip). Sinon, vous aurez l'expérience ennuyeuse de certains scripts accédant à la version de Python installée sur le système et d'autres accédant à votre propre installation.

Si vous souhaitez conserver le Python installé par le système, vous devez prendre deux autres décisions :

  1. Voulez-vous installer des paquets pour tous les utilisateurs, ou seulement pour vous ? L'installation pour tous les utilisateurs garantit que chaque programme qui utilise Python (y compris éventuellement les scripts administratifs) aura accès à tous les paquets que vous installez. Cependant, il y a une lointaine chance que cela interfère avec la propre utilisation de Python par El Capitan. (J'ose espérer qu'Apple utilise python -S pour s'assurer qu'ils obtiennent toujours les paquets qu'ils attendent, mais je n'ai aucun moyen de tester cela). L'installation pour votre propre compte utilisateur élimine la possibilité d'interférer avec l'installation Python du système. Note : si vous passez de l'installation système à l'installation pour le compte de l'utilisateur uniquement, vous devriez probablement profiter de cette occasion pour désinstaller tout ce qui est actuellement installé dans le dossier /Library/Python/2.7/site-packages et les scripts associés dans /usr/local/bin .

  2. Voulez-vous masquer les paquets supplémentaires qui sont installés avec la version OS X de Python ? (sous /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/ ), ou les garder dans le chemin de recherche ? Je recommande de les cacher, afin que les versions les plus récentes de ces paquets soient automatiquement installées dans des emplacements accessibles à l'utilisateur lorsque cela est nécessaire. Si vous ne cachez pas ce répertoire, vous recevrez occasionnellement des messages indiquant que Pip n'a pas pu supprimer un paquet existant afin de le mettre à jour vers une version plus récente (nécessaire pour un autre paquet que vous installez). Dans ce cas, vous devrez exécuter pip install --ignore-installed <package> qui installera la version la plus récente et masquera la version installée par le système. Cependant, si vous masquez l'ensemble de la /System/.../Extras/... vous perdrez l'accès à certains paquets Apple qui ne sont pas disponibles via pip, c'est-à-dire CoreGraphics et bonjour. (Si vous en avez besoin, vous pourrez peut-être y accéder en établissant un lien symbolique vers le répertoire des paquets de votre site).

Maintenant, voici les solutions de contournement. Il s'agit d'une bonne pratique sur toutes les versions d'OS X, afin d'éviter de remplacer ou de supprimer accidentellement des paquets Python utilisés par le système d'exploitation ; cependant, elles sont essentielles si vous souhaitez utiliser des paquets installés par l'utilisateur avec la version de Python fournie par Apple sur OS X El Capitan (10.11).

Installer pip

Vous l'avez probablement déjà fait, mais si ce n'est pas le cas, vous pouvez utiliser la commande suivante pour installer pip pour tous les utilisateurs :

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

Ou utilisez cette commande pour installer pip pour votre propre compte utilisateur uniquement :

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

Gérer les emplacements de fichiers partagés

Si vous installez des paquets pour tous les utilisateurs, créer un fichier appelé .pydistutils.cfg avec ces lignes (à partir de https://github.com/pypa/pip/issues/426 ) :

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

Si vous utilisez habituellement sudo -H pip ... alors vous devez placer ce fichier dans /var/root (répertoire personnel de l'utilisateur Root). Si vous utilisez habituellement sudo pip ... alors vous devez placer ce fichier dans votre propre répertoire personnel (~).

Ces paramètres empêcheront pip d'essayer d'écrire des éléments partagés comme les en-têtes et les pages de manuel sous le nom de /Library/System . (La commande en haut de cette réponse est une version plus rapide de la même chose). Ces paramètres sont nécessaires parce que le code spécifique à Darwin dans le fichier /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py n'arrive pas à définir ces variables à l'emplacement de l'écriture de la rac rac racine (bien qu'il définit correctement d'autres variables). Vous trouverez plus d'informations à ce sujet à l'adresse suivante https://github.com/pypa/pip/issues/3177 .

Si vous installez des paquets pour votre propre compte utilisateur uniquement, Les éléments partagés seront automatiquement installés sous ~/Library/Python/2.7/ . Mais vous devriez ajouter les lignes suivantes à votre ~/.profile afin que les éléments partagés soient trouvés lorsque vous en avez besoin :

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

Remarque : vous devrez lancer un nouveau shell ou exécuter ces commandes en ligne de commande pour que les changements prennent effet. Vous pouvez également exécuter hash -r si vous avez récemment supprimé les anciens scripts du chemin.

Gérer le chemin de Python

Vous devez vous assurer que les paquets que vous installez sont plus élevés dans l'ordre de recherche de Python que les paquets installés sur le système. Le moyen le plus simple d'y parvenir est d'utiliser .pth fichiers. Ceci suit la suggestion de @Sacrilicious ailleurs sur cette page mais assure que le répertoire des paquets du site de l'utilisateur est recherché avant le répertoire des paquets du site du système, et que les deux sont recherchés avant la bibliothèque standard et le répertoire Extras d'Apple (tous deux sous /System/...). Il omet également /System/.../Extras du chemin de recherche si vous le souhaitez.

Créez un fichier appelé fix_mac_path.pth avec le texte ci-dessous. Si vous installez des paquets pour tous les utilisateurs, fix_mac_path.pth doit être placé dans /Library/Python/2.7/site-packages . Si vous installez uniquement pour votre propre utilisateur, fix_mac_path.pth doit se trouver dans ~/Library/Python/2.7/lib/Python/site-packages. (Ce fichier peut avoir le nom que vous voulez, mais il doit être placé dans l'un ou l'autre de ces emplacements, et il doit se terminer par .pth ; de plus, tout le texte de ce fichier doit être sur une seule ligne).

Si vous voulez masquer les paquets installés par Apple dans /System/.../Extras :

Exécutez d'abord une des commandes suivantes pour obtenir une copie fonctionnelle de pip/setuptools indépendante de la version fournie par Apple :

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

Ensuite, mettez le code suivant dans fix_mac_path.pth à l'endroit indiqué ci-dessus :

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

Si vous voulez continuer à utiliser les paquets installés par Apple, vous n'avez pas besoin d'installer une autre copie de setuptools. Il suffit de mettre le code suivant dans fix_mac_path.pth à l'endroit indiqué ci-dessus :

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

Après cela, vous pouvez utiliser python -m site pour s'assurer que l'ordre de recherche des chemins a un sens.

Installer les paquets

Après cela, vous devriez être en mesure d'installer de nouveaux paquets en utilisant l'une des commandes suivantes.

Pour tous les utilisateurs :

sudo -H pip install <package>

Pour votre propre utilisateur :

pip install --user <package>

0 votes

Les instructions sont très claires et les alternatives sont expliquées en détail. J'ai suivi ce guide et j'ai réussi à surmonter le problème de la bibliothèque "six", ce qui m'a permis d'installer mitmproxy.

1 votes

C'est vraiment l'une des réponses les plus informatives, complètes et utiles que j'ai jamais rencontrées sur stackoverflow. Bien joué, et merci.

0 votes

@cmsjr, merci ! J'ai mis un certain temps à comprendre ce qui se passait, et cela me donne un bon endroit pour m'y référer !

31voto

Joey deVilla Points 4487

Premièrement, vous ne désactivez pas le SIP pour résoudre le problème. Désolé, c'est la raison pour laquelle la création de ce dossier échoue, mais nous devons contourner ce problème. Deuxièmement, vous perdez toutes les commodités qu'Apple pensait vous offrir, comme un pont via pyObjC, lorsque vous installez votre propre Python.
(Je l'admets, ils disent vous devez installer le vôtre pour /usr/local si vous êtes un développeur, j'ai juste s'opposer à la facilité avec de la bière).

Logiquement, vous devriez penser à l'installer là où SIP ne vous bloque pas, et il s'agit presque certainement d'une dépendance que pip résout pour vous. Indiquer à pip où vous voulez qu'il effectue les installations n'est pas tant le remède que de lui faire ignorer le matériel préexistant dans /System, qui est l'endroit où il vérifierait les dépendances pour beaucoup d'installations courantes qui ont besoin, par exemple, de six et SIP fait que Pip se casse lui-même quand il essaie de le mettre à jour. C'est en fait le comportement par défaut de pip d'installer dans /Library/Python/2.7/site-packages, vous devez juste dire --ignore-installed pour l'obliger à y installer toute version mise à jour des dépendances.
...Malheureusement, vous pouvez ensuite importer ce module dans une session interactive ou un script et obtenir de gros échecs - le paquet non mis à jour de /System est toujours utilisé !

Depuis les premiers jours de setuptools, Python a un moyen de rendre cette recherche explicite. C'est un peu bizarre (et cela devrait faire réfléchir ceux d'entre nous qui sont conscients de la sécurité et qui ne sont pas enchantés par le fait de placer un fichier en haut de la liste sans vérification, mais) vous pouvez placer un fichier qui se termine par .pth (par exemple, "elcap.pth") en /Library/Python/2.7/site-packages pour pousser ce répertoire au début de l'ordre de recherche avec le contenu suivant :
import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

Commencez une nouvelle session, et un voyage rapide à python -m site confirmera que vous avez inséré ce chemin dans le premier emplacement, et l'importation de modules devrait fonctionner.

Oh, et après tout cela, essayez d'installer simplement avec la commande pip. --user ou en utilisant l'option virtualenv - c'est la meilleure pratique pour la plupart des gens de toute façon.

1 votes

Maintenant, c'est élégant et un bon contrepoint à ma solution simpliste "abandonner le système Python et le brasser". Si vous avez besoin d'une solution rapide et sale, cela ne vaut peut-être pas la peine, mais garder pyObjC et un Python a beaucoup de mérite.

2 votes

Plus pythique et plus judicieux serait d'installer en tant que --user ou utiliser un virtualenv. Je pense simplement, en tant qu'administrateur système, que l'on n'installe qu'une seule fois pour un système, et que l'utilisateur doit pouvoir passer outre le système. Les objections à cette solution peuvent être que le système regarderait un chemin modifié, mais il y a le précédent que easy_install peut aussi écrire un fichier .pth.

2 votes

Je ne sais pas si la méthode de brew est la plus facile ou la plus mauvaise - il s'agit de résoudre des problèmes, et brew résout mes problèmes de façon spectaculaire - rien qu'en pensant à l'effort qu'il faudrait fournir pour jouer avec les nouveaux jouets (ruby 2.2.3, python3.5, MongoDB, Node4.2.1) de façon pratique, en tapant une commande et en recompilant, mettant à jour et éliminant les difficultés - eh bien, je prends le chemin le plus facile alors :) Je ne sais pas ce qui rend la version OS X de Python si différente, à part le support de Cocoa et de Threads et un grand nombre de paquets que je n'ai jamais utilisés auparavant et j'ai effectivement compilé mon tas de trucs Xcode/Kernel.

5voto

Richard Points 540

Croyez-moi, vous ne voulez pas vraiment que la bibliothèque écrive quoi que ce soit à ce niveau.

Auparavant, il n'était pas recommandé, mais possible, d'écrire en /System/Library/Frameworks/Python.framework/Versions/2.7/ mais maintenant, il n'est pas pris en charge par Apple SIP et c'est donc le problème du propriétaire de la bibliothèque. La distribution des paquets doit être mise à niveau pour fonctionner correctement avec cette mise à jour. La plupart des paquets ont été mis à jour et installent leur contenu dans /Library/Python/2.7/site-packages mais certains paquets n'ont pas été mis à jour.

Dans mon cas, c'était la bibliothèque greenlet qui essayait d'écrire son .h dans le dossier System Frameworks :

Comment le réparer : sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/" puis sudo -H pip install gevent

Pour numpy, le correctif est sudo -H pip install --ignore-installed -U numpy .

Pour les autres bibliothèques, les corrections varient de https://github.com/pypa/pip/issues/3177 a pip install --ignore-installed six y pip install --user (la dernière installe tout dans le chemin /User//Library/Python/2.7/). Voir aussi la réponse actuelle à ce message : https://apple.stackexchange.com/a/210021/169157

Si vous tapez python -m site il doit comprendre sys.path = [ ... '/Library/Python/2.7/site-packages', ... ] avant les chemins du système - c'est pourquoi (et comment) cela fonctionne.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X