Python >> Tutoriel Python >  >> Python Tag >> PIP

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

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

brew install python
pip --version

La désactivation de la protection de l'intégrité du système est également une option, mais je ne le recommande pas pour les serveurs gérés par des professionnels 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 l'indicateur est défini et ne peut pas être supprimé même en tant que root lorsque 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 correctifs/corvées via l'automatisation.


Une autre option viable sans qu'il soit nécessaire de désactiver SIP ou d'installer d'autres versions de Python consiste à installer les modules uniquement pour l'utilisateur actuel à l'aide de

pip install --user <modulename>

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


Ce problème survient souvent lorsque pip essaie d'installer une page de manuel pour IPython sur El Capitan. La solution rapide consiste à 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 le pip qui glissait auparavant, vous devrez donc probablement apporter d'autres modifications pour que le pip fonctionne correctement 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 sous OS X :

  1. distutils ne définit pas correctement deux variables importantes sur les Mac, donc pip essaie 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 antérieures 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 comme OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple installe des versions obsolètes de certains packages 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 package nécessitant une version plus récente de l'un d'entre eux, sudo pip supprimerait silencieusement l'ancienne version du /System/ dossier et installez 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 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 /System/Library/Frameworks/Python.framework/Versions/2.7/ au chemin de recherche python ci-dessus les emplacements d'installation de packages standard accessibles à l'utilisateur. 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 lorsque vous exécuterez 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 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.

  1. Voulez-vous continuer à utiliser la version Mac OS X de Python ou installer la vôtre ? Installer le vôtre est l'option la plus sûre et peut être effectué via le programme d'installation officiel de Python, Homebrew ou Anaconda. C'est aussi ce que préconise Apple, comme le souligne @Sacrilicious. Si vous installez votre propre version de Python, vous devriez probablement désinstaller tout ce qui est actuellement installé dans /Library/Python/2.7/site-packages et tous les scripts qui ont été installés dans /usr/local/bin pour ces packages (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 vous en tenir au Python installé sur le système, vous devez prendre deux autres décisions :

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

  2. Voulez-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 par 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 (requis par un package différent 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 sur le système. Cependant, si vous masquez tout le /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 créant par un lien symbolique dans votre répertoire site-packages.)

Maintenant, voici les solutions de contournement. Ce serait une bonne pratique sur toutes les versions d'OS X, pour é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 le 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 des 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 devez mettre ce fichier en /var/root (répertoire personnel de l'utilisateur root). Si vous utilisez habituellement sudo pip ... , vous devez alors 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 des en-têtes et des 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 dans /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 par la racine (bien qu'il définisse correctement d'autres variables). Il y a plus d'informations à ce sujet sur https://github.com/pypa/pip/issues/3177 .

Si vous installez des packages pour votre propre compte utilisateur uniquement, les éléments partagés seront automatiquement installés sous ~/Library/Python/2.7/ . Mais vous devez ajouter les lignes suivantes à votre ~/.profile afin 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 exécuter hash -r si vous avez récemment supprimé d'anciens scripts du chemin.

Gérer le chemin Python

Vous devrez vous assurer que les packages que vous installez sont plus élevés dans l'ordre de recherche de Python que les packages installés sur le système. Le moyen le plus simple de le faire est d'utiliser .pth des dossiers. Cela suit la suggestion de @Sacrilicious ailleurs sur cette page, mais garantit que votre répertoire de packages de site utilisateur est recherché avant votre répertoire de packages de site à l'échelle du système, et 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 à partir 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 packages 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 devrait être dans ~/Library/Python/2.7/lib/python/site-packages. (Ce fichier peut avoir n'importe quel nom, mais il doit être placé dans l'un de ces emplacements ou dans les deux, et il doit se terminer par .pth; de plus, tout le texte de ce fichier doit être sur une seule ligne.)

Si vous souhaitez masquer les packages installés par Apple dans /System/.../Extras :

Exécutez d'abord 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

Mettez ensuite 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 souhaitez continuer à utiliser les packages installés par Apple, vous n'avez pas besoin d'installer une autre copie de setuptools. Mettez simplement 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 vous assurer que l'ordre de recherche du chemin est logique.

Installer des packages

Après cela, vous devriez pouvoir installer de nouveaux packages à l'aide de l'une des commandes suivantes.

Pour tous les utilisateurs :

sudo -H pip install <package>

Pour votre propre utilisateur :

pip install --user <package>