Après la mise à jour El Capitan, je suis incapable d'exécuter l'installation pip. L'erreur que je reçois est que "l'opération n'est pas autorisée" lorsque pip tente de créer de nouveaux dossiers lors de 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 sans succès. Aussi j'ai 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 installer à nouveau les bibliothèques python sans problème?
macos
el-capitan
permission
python
authorization
web_ninja
la source
la source
Réponses:
Une solution rapide est d'utiliser homebrew pour installer
python
en/usr/local/bin
sorte que votrepip
peut fonctionner sur un cadre de python-modifiable par l' utilisateur.La désactivation de la protection de l’intégrité du système est également une option, mais je ne le recommande pas pour des serveurs gérés par des professionnels et dotés de parois coupe-feu où vous avez la main-d’œuvre pour gérer la détection des intrusions ou si vous êtes un développeur / sysadmin et devez tester des éléments avec et sans. SIROTER.
Vous verrez que le drapeau restreint est défini et ne peut pas être supprimé même en tant que root tant que SIP est activé.
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 / tâches via l'automatisation.
la source
brew install python
c’est l’option la plus simple, bien que le nettoyage d’une autre configuration puisse être nécessaire si vous utilisez le système Python depuis un certain temps (par exemple, les fichiers Python appartenant à un utilisateur racine/usr/local/bin
et~/Library/Caches/pip
).brew
car il est facile d'épingler une version que vous aimez - gérez plusieurs versions différentes ou maintenez les éléments à jour régulièrement. Si vous avez quelque chose qui fonctionne pour vous, cependant - il est difficile de dire que vous devriez changer quelque chose.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
S'il ne s'agit que de votre machine personnelle, ce serait la solution la plus simple et la plus sûre.
la source
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:
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 aussiOSError: [Errno: 1]
, mais il vient après un message commeUninstalling 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.
/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 pourpip 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 :
Ou utilisez cette commande pour installer pip pour votre propre compte utilisateur uniquement :
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 ):
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 habituellementsudo 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: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, vousfix_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:
Ensuite, insérez le code suivant
fix_mac_path.pth
à l'emplacement spécifié ci-dessus: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: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:
Pour votre propre utilisateur:
la source
Premièrement, vous ne désactivez pas 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 le problème. Deuxièmement, vous perdez toutes les subtilités que Apple pensait vous donner, comme un pont via pyObjC, lorsque vous installez votre propre Python.
(J'admets, ils disent que vous devriez installer le vôtre
/usr/local
si vous êtes développeur, je m'oppose juste à ce qu'il soit facile avec brew.)Logiquement, vous pourriez penser à l'installer dans un endroit où SIP ne vous bloque pas, et c'est presque certainement une solution que le pépin de dépendance résout pour vous. Indiquer à pip où vous voulez qu'il effectue des installations n'est pas une solution, mais bien de le laisser ignorer les éléments préexistants dans / System, où il vérifie les dépendances de nombreuses installations courantes nécessitant, par exemple
six
, et SIP provoque pip se casser quand il va essayer de le mettre à jour. C'est le comportement par défaut de pip à installer dans /Library/Python/2.7/site-packages, il vous suffit de dire--ignore-installed
de le forcer à installer toutes les versions mises à jour des dépendances.... Malheureusement, vous pouvez ensuite importer ce module dans une session interactive ou dans un script et obtenir de gros échecs - il regarde toujours le paquet / System non mis à jour!
Depuis les premiers jours de setuptools, Python dispose d’un moyen de rendre cette recherche explicite. C'est un peu bizarre (et devrait provoquer une pause pour ceux d'entre nous qui sommes conscients de la sécurité et qui ne sont pas ravis de la brutalité de la placer en tête de liste sans vérifier, mais) vous pouvez placer un fichier qui se termine par
.pth
( par exemple, 'elcap.pth')/Library/Python/2.7/site-packages
pour placer 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 rapide voyage vous
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 simplement d'installer avec l'
--user
option pip ou d'utiliser un serveur virtuel - c'est de toute façon la meilleure pratique pour la plupart des gens.la source
--user
ou d'utiliser un virtualenv. En tant qu'administrateur système, je pense simplement que vous installez une fois pour un système et que l'utilisateur doit pouvoir remplacer le système. Les objections à cette solution peuvent être que le système examine un chemin modifié, mais il existe un précédent selon lequel easy_install peut également écrire un fichier .pth.sudo pip install --ignore-installed ipython
et il fonctionne jusqu'à ce que « Running setup.py install pour pexpect », au cours de laquelle pip point encore essaie de mettre à jour quelque chose dans /System/Library/Frameworks/Python.framework/Versions/2.7/share et des erreurs liées.pip --user
et virtualenv ne fonctionne toujours pas.Je pense que cela est dû au SIP ou à la protection de l'intégrité du système , une sorte de protection de fichier en temps réel qui ressemble à un antivirus Windows :) et qui empêche toute modification que vous souhaitez apporter aux dossiers système OS X. Apple a simplement décidé de désactiver les modifications du système - pour vous assurer que vous êtes pleinement protégé contre le mal d’Internet et contre les autres forces pervers liées à l’informatique, contre lesquelles SIP nous protège.
Si vous souhaitez désactiver SIP, vous devez démarrer Recovery HD en maintenant les touches Commande + R simultanément lorsque vous démarrez votre Mac.
Ouvrez le terminal à partir du menu Utilitaires, tapez-le
csrutil disable
, puis appuyez sur Retour. Allez au menu Apple pour redémarrer.SIP serait désactivé à partir de maintenant. Je l'ai désactivé il y a longtemps et je n'ai rien remarqué de mal, certains processus semblent se plaindre, mais ils le font toujours sous OS X, donc je ne suis pas sûr que cela soit causé par le manque de «protection» de l'intégrité du système.
Mon conseil est de vous débarrasser complètement de SIP et / ou d’utiliser homebrew pour l’ensemble de vos logiciels opensource / de développement. Homebrew utilise le répertoire / usr / local pour sa mise en place et ne se heurte pas à d'autres composants du système. Les versions homebrew sont plus à jour que les versions OS x apple.
la source
/System
; hors limites à partir de 10.11. Nous pouvons utiliser csrutil pour le désactiver temporairement si nous sommes coincés, bien que je sache que cela pourrait donner l’impression que cela pourrait se transformer en whack-a-mole, mais cela ne semble pas être une bonne raison de l’employer. La laisser est… pourquoi nous ne pouvons pas avoir de belles choses.statusSystem Integrity Protection status: enabled (Custom Configuration). Configuration: Apple Internal: disabled Kext Signing: disabled Filesystem Protections: disabled Debugging Restrictions: disabled DTrace Restrictions: disabled NVRAM Protections: disabled
et je n'ai aucune raison de l'activer, mon système étant plutôt étanche, personnalisé et personnaliséUtilisé à la
pip3 install <package>
place et résolu le problème de permission danspip
.la source
Croyez-moi, vous ne voulez pas vraiment que la bibliothèque écrive quoi que ce soit sur ce chemin.
Il était auparavant déconseillé, mais il était possible d'écrire
/System/Library/Frameworks/Python.framework/Versions/2.7/
dessus, mais maintenant, il n'est pas pris en charge en raison d'Apple SIP. C'est donc le problème du propriétaire de la bibliothèque. La distribution du package doit être mise à niveau pour fonctionner correctement avec cette mise à jour. La plupart des packages ont été mis à jour et y ont installé leur contenu/Library/Python/2.7/site-packages
, mais certains packages n'ont pas été mis à jour.Dans mon cas, c’était une bibliothèque de greenlet qui essayait d’écrire son
.h
fichier dans le dossier System Frameworks:Comment y remédier:
sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/"
alorssudo -H pip install gevent
Pour numpy, le correctif est
sudo -H pip install --ignore-installed -U numpy
.Pour les autres bibliothèques, les correctifs varient de https://github.com/pypa/pip/issues/3177 à
pip install --ignore-installed six
etpip install --user
(le dernier installe tout dans /User//Library/Python/2.7/ path). Voir aussi la réponse actuelle la plus récente à ce message: https://apple.stackexchange.com/a/210021/169157Si vous tapez
python -m site
cela devrait incluresys.path = [ ... '/Library/Python/2.7/site-packages', ... ]
avant les chemins système - c’est pourquoi (et comment) cela fonctionne.la source
Je l'ai fait comme suit:
puis après l'installation de python:
la source
brew install python
installe déjà pip avec elle. Si vous installez ensuite pip via easy_install, vous vous retrouverez probablement avec deux installations de pip pouvant être source de problèmes.Une solution très intéressante pour ce problème consiste à utiliser virtualenv (virtualenvwrapper). Après avoir créé un nouvel environnement pour votre projet, vous pouvez utiliser pip sans problèmes. J'ai donc utilisé virtualenvwrapper et ces deux lignes permettent de résoudre le problème:
la source
pip install virtualenv
ou pip ne fonctionne pas et vous devez utilisersudo easy_install
+1 pour ce qui est déjà là. Cheerssudo easy_install
fonctionneJ'ai python3 installé sur mon mac alors que le python2.7 original est livré avec OSX. Donc, chaque fois que je veux invoquer python3, je tape simplement $ python3 ... Peut-être devriez-vous essayer $ python3 get-pip.py, cela fonctionne pour moi quand j'ai à peu près le même problème avec vous.
la source
Sommaire
J'ai rencontré ce problème sous Mac OS X 10.11.6 (qui dispose de SIP) car j'ai installé pip à l'aide de la commande system easy_install et du fichier local easy-install.pth faisant référence aux bibliothèques système.
Lors de l'installation de packages ultérieurs avec pip, certaines dépendances ont été résolues dans les anciennes bibliothèques System Python.
La solution consistait à supprimer mes bibliothèques installées localement et à réinstaller une version python locale (qui inclut pip) à partir de https://www.python.org/downloads/ afin que le système et les instances python installées localement soient conservés séparément.
J'avais essayé d'utiliser le correctif fix_mac_path.pth dans la réponse de @mfripp mais j'ai trouvé la suppression et la réinstallation du nettoyeur.
Cause
(Ne suivez pas ces étapes)
Je rencontre ce problème en essayant d'installer Ansible. J'ai suivi les documents Ansible pour l'installation sur OS X via pip.
Tout d'abord, j'ai installé pip avec.
sudo easy_install pip
Ceci utilisait System easy_install sur
/usr/bin/easy_install
et installé pip sur./Library/Python/2.7/site-packages/pip
J'ai également reçu les avertissements suivants lors de l'installation de pip, mais je les ai ignorés et je les ai laissés aveuglément.
Plus tard, en regardant
/Library/Python/2.7/site-packages/easy-install.pth
, ça ressemblait à ceciPuis j'ai installé ansible via pip
J'ai eu des messages pour dire que les exigences étaient déjà remplies par les bibliothèques système
Puis, quand j'ai couru ansible, j'ai eu ce problème
et une vérification du pépin a révélé que paramiko avait besoin d'un setuptools plus récent
Notez que ansible n’a requis que setuptools (pas de version) et donc pip a signalé la dépendance satisfaite par le système setuptools.
Solution
Je résolus en désinstallant les bibliothèques python locales en utilisant le processus laissé entrevoir https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Pour moi , cela impliqué
Ensuite, j'ai supprimé les liens symboliques et les exécutables de / usr / local / bin tels que
etc. J'ai aussi supprimé toutes les applications
J'ai ensuite téléchargé le package d'installation 2.7.13 pour Mac OS X à l' adresse https://www.python.org/downloads/ et je l'ai installé .
Ceci a installé un python local et un pip at
/Library/Frameworks/Python.framework/Versions/2.7
ainsi que des liens symboliques dans/usr/local/bin
lesquels sont séparés les bibliothèques système à/System/Library/Frameworks/Python.framework
et/usr/bin
pour que je reçoiveet en
pip list
ansible travaille maintenant pour moi
la source
Pour moi, le
PATH
avait disparu depuispip
, cela a été confirmé en exécutantpython -m pip
Deux solutions possibles ici, ajouter de
pip
nouveau àPATH
. Dans mon cas, ilpip
était de toute façon obsolète, donc la mise à niveau le corrige:python -m pip install --upgrade pip
✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
la source