Ce problème se pose souvent lorsque pip tente d'installer une page de manuel pour IPython sur El Capitan. La solution rapide consiste à utiliser une commande pip comme ceci:
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 glissait auparavant. Vous devrez donc probablement apporter quelques modifications supplémentaires pour que pip fonctionne correctement avec El Capitan.
SIP sur El Capitan expose trois problèmes d'utilisation de pip avec la version de Python fournie par Apple sur OS X:
distutils ne définit pas correctement deux variables importantes sur les Mac, aussi pip tente-t-il d'écrire des en-têtes et d'autres fichiers partagés (par exemple, des pages de manuel) sous /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 exécuté avec sudo. Cependant, il échoue sur El Capitan en raison de SIP. C'est l'erreur que vous avez rencontrée. Il donne des messages commeOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple installe des versions obsolètes de certains packages /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 package nécessitant une version plus récente de l’une d’elles, sudo pip
supprimait silencieusement l’ancienne version du /System/
dossier et installait une version plus récente dans /Library/Python/2.7/site-packages
. C'était également une mauvaise idée et n'est plus possible avec SIP. Mais maintenant, pip va planter avec un message d'erreur en essayant de supprimer l'ancien paquet. Ce message est aussi 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 .
La version Apple de Python ajoute plusieurs répertoires sous /System/Library/Frameworks/Python.framework/Versions/2.7/
le chemin de recherche python, au - dessus des emplacements d'installation de packages standard accessibles aux utilisateurs. Donc, si vous installez une version plus récente d'un paquet ailleurs (par exemple, sudo -H pip install --ignore-installed six
), vous recevrez un message indiquant que l'installation a réussi, mais ensuite, lorsque vous exécutez python, vous obtiendrez l'ancienne version /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Cela rend également impossible l'utilisation de nouveaux packages portant le même nom que les modules de la bibliothèque standard.
Vous pouvez contourner ces problèmes, mais la méthode dépend de vos réponses à trois questions.
- Voulez-vous continuer à utiliser la version Mac OS X de Python ou installer la vôtre? L'installation de votre propre est l'option la plus sûre, et peut être effectuée via l'installateur officiel de Python, Homebrew ou Anaconda. C'est également ce que recommande Apple , comme l'a souligné @Sacrilicious . Si vous installez votre propre version de Python, vous devriez probablement désinstaller tout ce qui est actuellement installé
/Library/Python/2.7/site-packages
et tous les scripts installés /usr/local/bin
pour ces packages (y compris pip). Sinon, certains scripts accèderont à la version de Python installée par le système et certains accéderont à votre propre installation.
Si vous souhaitez vous en tenir à Python installé par le système, vous devez prendre deux autres décisions:
Voulez-vous installer des packages pour tous les utilisateurs ou juste pour vous-même? L'installation pour tous les utilisateurs garantit que chaque programme utilisant Python (y compris éventuellement des scripts administratifs) aura accès à tous les packages que vous installez. Cependant, il y a une chance lointaine que cela interfère avec l'utilisation de Python par El Capitan. (J'espère que Apple utilise python -S
pour obtenir les packages auxquels ils s'attendent, mais je n'ai aucun moyen de le vérifier.) L'installation pour votre propre compte utilisateur élimine la possibilité d'interférer avec l'installation Python du système. Remarque: si vous envisagez de passer d'une installation système à une installation utilisateur, vous devriez probablement saisir cette occasion pour désinstaller tout élément actuellement installé /Library/Python/2.7/site-packages
et les scripts associés dans /usr/local/bin
.
Souhaitez-vous masquer les packages supplémentaires installés avec la version OS X de Python (sous /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) ou les conserver dans le chemin de recherche? Je recommande de les masquer afin que les versions les plus récentes de ces packages soient automatiquement installées dans des emplacements accessibles à l'utilisateur en cas de besoin. Si vous ne masquez pas ce répertoire, vous recevrez parfois des messages indiquant que pip n'a pas pu supprimer un package existant afin de le mettre à niveau vers une version ultérieure (nécessaire pour un autre package que vous installez). Dans ce cas, vous devrez exécuter la procédure pour pip install --ignore-installed <package>
installer la version la plus récente et masquer la version installée sur le système. Cependant, si vous cachez le tout/System/.../Extras/...
répertoire, vous perdrez l’accès à certains packages 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 les liant à votre répertoire site-packages.)
Maintenant, voici les solutions de contournement. Cela serait une bonne pratique sur toutes les versions d’OS X, afin d’éviter de remplacer ou de supprimer accidentellement les packages Python utilisés par le système d’exploitation; Cependant, ils sont essentiels si vous souhaitez utiliser des packages 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 sinon, 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 packages pour tous les utilisateurs, créez 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 devriez mettre ce fichier dans /var/root
(répertoire de base pour l'utilisateur root). Si vous utilisez habituellement sudo pip ...
, alors vous devriez mettre ce fichier dans votre propre répertoire personnel (~).
Ces paramètres empêcheront pip d'essayer d'écrire des éléments partagés tels que les en-têtes et les pages de manuel sous /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 car le code spécifique à darwin /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
ne parvient pas à définir ces variables sur des emplacements accessibles en écriture à la racine (bien qu'il définisse correctement les autres variables). Pour plus d'informations à ce sujet, rendez-vous sur https://github.com/pypa/pip/issues/3177 .
Si vous installez des packages uniquement pour votre propre compte utilisateur, les éléments partagés seront automatiquement installés sous ~/Library/Python/2.7/
. Mais vous devriez ajouter les lignes suivantes à votre ~ / .profile pour que les éléments partagés soient trouvés lorsque vous en aurez besoin:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
Remarque: vous devrez démarrer un nouveau shell ou les exécuter sur la ligne de commande pour que les modifications prennent effet. Vous pouvez également vouloir exécuter hash -r
si vous avez récemment supprimé les anciens scripts du chemin.
Gérer le chemin Python
Vous devez vous assurer que les packages que vous installez sont plus élevés dans l'ordre de recherche de Python que les packages installés par le système. La façon la plus simple de procéder consiste à utiliser des .pth
fichiers. Ceci suit la suggestion de @ Sacrilicious ailleurs sur cette page , mais garantit que votre répertoire sites-packages utilisateur est recherché avant votre répertoire site-packages, et les deux avant la bibliothèque standard et le répertoire Extras d’Apple (tous deux sous / System /. ..). Il omet également /System/.../Extras
le 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 packages pour tous les utilisateurs, fix_mac_path.pth
vous devez les placer dans /Library/Python/2.7/site-packages
. Si vous installez uniquement pour votre propre utilisateur, vous fix_mac_path.pth
devriez être dans ~ / Library / Python / 2.7 / lib / python / site-packages. (Ce fichier peut avoir le nom de votre choix, mais il doit être placé dans un ou deux de ces emplacements et se terminer par .pth
; tout le texte de ce fichier doit également figurer sur une seule ligne.)
Si vous souhaitez masquer les packages installés par Apple dans /System/.../Extras
:
Commencez par l’une des commandes suivantes pour obtenir une copie de travail de pip / setuptools indépendamment 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, insérez le code suivant fix_mac_path.pth
à l'emplacement spécifié 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 souhaitez continuer à utiliser les packages installés par Apple, vous n'avez pas besoin d'installer une autre copie de setuptools. Il suffit de mettre le code suivant fix_mac_path.pth
à l'emplacement spécifié 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 vous python -m site
assurer que l’ordre de recherche du chemin a du sens.
Installer des paquets
Après cela, vous devriez pouvoir installer de nouveaux packages en utilisant l’une des commandes suivantes.
Pour tous les utilisateurs:
sudo -H pip install <package>
Pour votre propre utilisateur:
pip install --user <package>