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 :
-
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'
-
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 .
-
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.
-
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 :
-
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
.
-
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>
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)
0 votes
Comment avez-vous installé pip - il devrait écrire dans /Bibliothèque/Python/2.7/site-packages et non dans /Système
0 votes
Je ne m'en souviens plus maintenant. J'ai compris après avoir posté le commentaire que c'était le problème et j'ai utilisé brew pour installer Python et cela a corrigé l'emplacement de pip.
0 votes
Eh bien, il n'est pas installé correctement car le Python de Hombrew ne s'installe pas dans /System.