Después de la actualización de El Capitan, no puedo ejecutar la instalación de pip. El error que obtengo es que la "operación no está permitida" cuando pip intenta crear nuevas carpetas durante la instalación.
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
De hecho, en general no puedo crear carpetas, etc. en estas carpetas. He intentado usar sudo que no ayuda. Tambien he hecho
sudo chflags nouchg /System/Library/Frameworks/Python.framework/Versions/2.7/
Lo anterior tampoco ayudó. ¿Qué puedo hacer para poder instalar bibliotecas de Python sin problemas nuevamente?
macos
el-capitan
permission
python
authorization
web_ninja
fuente
fuente
Respuestas:
Una solución rápida es utilizar homebrew para instalar
python
en/usr/local/bin
para que supip
puede funcionar contra un marco pitón modificable por el usuario.Desactivar la Protección de integridad del sistema también es una opción, pero no lo recomiendo para nada que no sea servidores administrados profesionalmente y con firewall donde tenga la mano de obra para administrar la detección de intrusiones o si es un desarrollador / administrador de sistemas y necesita probar cosas con y sin SORBO.
Verá que se establece el indicador restringido que no se puede eliminar incluso como root mientras SIP está activado.
El uso de homebrew hace posible administrar pip y python por separado que la versión proporcionada por el sistema. Como beneficio adicional, el marco homebrew está diseñado para facilitar el mantenimiento y los parches / tareas a través de la automatización.
fuente
brew install python
es la opción más simple, aunque puede ser necesario limpiar alguna otra configuración si ha estado utilizando el sistema Python durante algún tiempo (por ejemplo, archivos Python propiedad de root debajo/usr/local/bin
y~/Library/Caches/pip
)brew
ya que es fácil anclar una versión que te gusta: administrar múltiples versiones diferentes o mantener las cosas actualizadas regularmente. Sin embargo, si tiene algo que funcione para usted, es difícil argumentar que debería cambiar algo.Otra opción viable sin la necesidad de deshabilitar SIP o instalar otras versiones de Python, es instalar los módulos solo para el usuario actual que usa
Si es solo su máquina personal, esta sería la solución más simple y segura.
fuente
Este problema a menudo surge cuando pip intenta instalar una página de manual para IPython en El Capitan. La solución rápida es usar un comando pip como este:
Sin embargo, la Protección de integridad del sistema (SIP) en El Capitan bloquea varias malas prácticas con pip que solía pasar, por lo que probablemente necesitará hacer algunos cambios más para que el pip funcione sin problemas en El Capitan.
SIP en El Capitan expone tres problemas al usar pip con la versión de Python suministrada por Apple en OS X:
distutils no establece correctamente dos variables importantes en Mac, por lo que pip intenta escribir encabezados y otros archivos compartidos (por ejemplo, páginas de manual) en
/System/Library/Frameworks/Python.framework/Versions/2.7/
. Esta es una mala idea, pero en versiones anteriores de OS X, tuvo éxito si pip se ejecutaba con sudo. Sin embargo, falla en El Capitán debido a SIP. Este es el error con el que te has encontrado. Da mensajes comoOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple instala versiones obsoletas de algunos paquetes en
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(por ejemplo, seis). En versiones anteriores de OS X, cuando instalaba un paquete que necesitaba una versión más nueva de uno de estos,sudo pip
eliminaba silenciosamente la versión anterior de la/System/
carpeta e instalaba una versión más nueva/Library/Python/2.7/site-packages
. Esto también fue una mala idea, y ya no es posible con SIP. Pero ahora pip se bloqueará con un mensaje de error al intentar eliminar el paquete anterior. Ese mensaje también lo esOSError: [Errno: 1]
, pero viene después de un mensaje comoUninstalling six-1.4.1:
. Ver, por ejemplo, https://github.com/pypa/pip/issues/3165 .La versión de Python para Apple agrega varios directorios
/System/Library/Frameworks/Python.framework/Versions/2.7/
a la ruta de búsqueda de Python sobre las ubicaciones de instalación de paquetes accesibles para el usuario estándar. Entonces, si instala una versión más nueva de un paquete en otro lugar (por ejemplo,sudo -H pip install --ignore-installed six
), recibirá un mensaje de que la instalación se realizó correctamente, pero luego, cuando ejecute python, obtendrá la versión anterior/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Esto también hace que sea imposible usar paquetes nuevos que tengan el mismo nombre que los módulos de la biblioteca estándar.Puede solucionar estos problemas, pero el método depende de sus respuestas a tres preguntas.
/Library/Python/2.7/site-packages
y los scripts que se instalaron/usr/local/bin
para esos paquetes (incluido pip). De lo contrario, tendrá la experiencia molesta de algunos scripts que acceden a la versión de Python instalada en el sistema y algunos que acceden a su propia instalación.Si desea seguir con Python instalado en el sistema, debe tomar dos decisiones más:
¿Desea instalar paquetes para todos los usuarios, o solo para usted? La instalación para todos los usuarios garantiza que todos los programas que usan Python (incluidos posiblemente los scripts administrativos) tendrán acceso a todos los paquetes que instale. Sin embargo, existe una remota posibilidad de que interfiera con el uso de Python por parte de El Capitán. (Espero que Apple use
python -S
para asegurarse de que siempre obtengan los paquetes que esperan, pero no tengo forma de probar esto). La instalación solo para su propia cuenta de usuario elimina la posibilidad de interferir con la instalación de Python del sistema. Nota: si va a cambiar de la instalación de todo el sistema a solo para usuarios, probablemente debería aprovechar esta oportunidad para desinstalar todo lo que esté instalado actualmente/Library/Python/2.7/site-packages
y las secuencias de comandos relacionadas/usr/local/bin
.¿Desea ocultar los paquetes adicionales que se instalan con la versión OS X de Python (debajo
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) o mantenerlos en la ruta de búsqueda? Recomiendo ocultarlos, para que las versiones más recientes de estos paquetes se instalen automáticamente en ubicaciones accesibles para el usuario cuando sea necesario. Si no oculta este directorio, ocasionalmente recibirá mensajes de que pip no pudo eliminar un paquete existente para actualizarlo a una versión posterior (que necesita un paquete diferente que esté instalando). En ese caso, deberá ejecutarpip install --ignore-installed <package>
, que instalará la versión más nueva y ocultará la versión instalada del sistema. Sin embargo, si ocultas todo/System/.../Extras/...
directorio, perderá acceso a algunos paquetes de Apple que no están disponibles a través de pip, es decir, CoreGraphics y bonjour. (Si los necesita, puede obtener acceso si los vincula a su directorio de paquetes del sitio).Ahora, aquí están las soluciones. Sería una buena práctica en todas las versiones de OS X, para evitar reemplazar o eliminar accidentalmente los paquetes de Python utilizados por el sistema operativo; sin embargo, son esenciales si desea utilizar paquetes instalados por el usuario con la versión de Python suministrada por Apple en OS X El Capitan (10.11).
Instalar pip
Probablemente ya lo haya hecho, pero si no, puede usar el siguiente comando para instalar pip para todos los usuarios :
O use este comando para instalar pip solo para su propia cuenta de usuario :
Administrar ubicaciones de archivos compartidos
Si está instalando paquetes para todos los usuarios, cree un archivo llamado .pydistutils.cfg con estas líneas (desde https://github.com/pypa/pip/issues/426 ):
Si usas habitualmente
sudo -H pip ...
, debes colocar este archivo en/var/root
(directorio de inicio para el usuario root). Si usas habitualmentesudo pip ...
, debes colocar este archivo en tu propio directorio personal (~).Esta configuración evitará que pip intente escribir elementos compartidos como encabezados y páginas de manual en
/Library/System
. (El comando en la parte superior de esta respuesta es una versión más rápida de la misma cosa). Esta configuración es necesaria porque el código específico de darwin/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
falla al establecer estas variables en ubicaciones que se pueden escribir en la raíz (aunque establece otras variables correctamente). Hay más información sobre esto en https://github.com/pypa/pip/issues/3177 .Si instala paquetes solo para su propia cuenta de usuario, los elementos compartidos se instalarán automáticamente en
~/Library/Python/2.7/
. Pero debe agregar las siguientes líneas a su perfil ~ /. Para que los elementos compartidos se encuentren cuando los necesite:Nota: deberá iniciar un nuevo shell o ejecutarlos en la línea de comandos para que los cambios surtan efecto. También es posible que desee ejecutar
hash -r
si recientemente eliminó los scripts antiguos de la ruta.Administrar ruta de Python
Deberá asegurarse de que los paquetes que instale sean más altos en el orden de búsqueda de Python que los paquetes instalados por el sistema. La forma más fácil de hacer esto es con
.pth
archivos. Esto sigue la sugerencia de @ Sacrilicious en otra parte de esta página , pero asegura que el directorio de paquetes de sitio del usuario se busque antes que el directorio de paquetes de sitio de todo el sistema, y ambos se busquen antes de la biblioteca estándar y el directorio Extras de Apple (ambos en / System /. ..). También se omite/System/.../Extras
de la ruta de búsqueda si lo desea.Cree un archivo llamado
fix_mac_path.pth
, con el texto a continuación. Si está instalando paquetes para todos los usuarios,fix_mac_path.pth
debe colocarse en/Library/Python/2.7/site-packages
. Si está instalando solo para su propio usuario,fix_mac_path.pth
debe estar en ~ / Library / Python / 2.7 / lib / python / site-packages. (Este archivo puede tener el nombre que desee, pero debe colocarse en una o ambas ubicaciones, y debe terminar con.pth
; además, todo el texto de este archivo debe estar en una línea).Si desea ocultar los paquetes instalados por Apple en
/System/.../Extras
:Primero ejecute uno de los siguientes comandos para obtener una copia de trabajo de pip / setuptools independiente de la versión suministrada por Apple:
Luego ponga el siguiente código en
fix_mac_path.pth
la ubicación especificada arriba:Si desea seguir usando los paquetes instalados por Apple, no necesita instalar otra copia de las herramientas de configuración. Simplemente ingrese el siguiente código en
fix_mac_path.pth
la ubicación especificada arriba:Después de esto, puede usar
python -m site
para asegurarse de que el orden de búsqueda de ruta tenga sentido.Instalar paquetes
Después de esto, debería poder instalar nuevos paquetes usando uno de los siguientes comandos.
Para todos los usuarios:
Para su propio usuario:
fuente
Primero, no está deshabilitando SIP como una forma de abordar el problema. Lo sentimos, esa es la razón por la que esta creación de carpeta está fallando, pero tenemos que solucionarlo. En segundo lugar, pierde todas las bondades que Apple pensó que le estaban dando, como un puente a través de pyObjC, cuando instala su propio Python.
(Admito, dicen que deberías instalar el tuyo
/usr/local
si eres un desarrollador, solo me opongo a hacerlo de la manera fácil con brew).Lógicamente, pensaría instalarlo en algún lugar que SIP no lo esté bloqueando, y esto es casi seguro que algún pip de dependencia lo está resolviendo. Decirle a pip dónde desea que realice las instalaciones no es el remedio tanto como ignorar las cosas preexistentes en / System, que es donde buscaría dependencias para muchas instalaciones comunes que necesitan, por ejemplo
six
, y SIP causa pip para romperse cuando se trata de intentar actualizarlo. En realidad, es el comportamiento predeterminado de pip instalar en /Library/Python/2.7/site-packages, solo necesita decir--ignore-installed
para forzarlo a instalar cualquier versión actualizada de dependencias allí.... Desafortunadamente, puede importar este módulo en una sesión interactiva o secuencia de comandos y obtener fallas gordas agradables, ¡todavía está mirando el paquete no actualizado de / System!
Desde los primeros días de setuptools, Python tiene una forma de hacer explícita esa búsqueda. Es un poco extraño (y debería provocar una pausa para aquellos de nosotros que somos conscientes de la seguridad y no estamos entusiasmados con la brusquedad de colocarlo en la parte superior de la lista sin verificar, pero) puede colocar un archivo que termine con
.pth
( por ejemplo, 'elcap.pth')/Library/Python/2.7/site-packages
para empujar ese directorio al frente del orden de búsqueda con los siguientes contenidos:import sys; sys.path = ['/Library/Python/2.7/site-packages'] + sys.path
Inicie una nueva sesión, y un viaje rápido a
python -m site
confirmará que ha insertado esa ruta en la primera ranura, y la importación de módulos debería funcionar.Ah, y después de todo esto, intente simplemente instalar con la
--user
opción de pip , o usar un virtualenv ; de todos modos, esa es la mejor práctica para la mayoría de las personas.fuente
--user
o usar un virtualenv. Estoy convencido, como administrador del sistema, de que instale una vez para un sistema y que el usuario pueda anular el sistema. Las objeciones a esta solución pueden ser que el sistema estaría buscando una ruta alterada, pero existe el precedente de que easy_install también puede escribir un archivo .pth.sudo pip install --ignore-installed ipython
y se ejecuta hasta "Ejecutar setup.py install para pexpect", momento en el que pip todavía intenta actualizar algo en /System/Library/Frameworks/Python.framework/Versions/2.7/share, y se eliminan los errores.pip --user
y virtualenv todavía no funciona.Creo que es debido a SIP o System Integrity Protection , un tipo de protección de archivos en tiempo real que se siente como un antivirus de Windows :) y detiene cualquier cambio que desee realizar en las carpetas del sistema OS X. Apple simplemente decidió deshabilitar las modificaciones del sistema, para asegurarse de estar completamente protegido del mal de Internet y de otras fuerzas del mal relacionadas con la computadora de las que SIP nos está protegiendo.
Si desea deshabilitar SIP , debe iniciar en Recovery HD manteniendo presionadas las teclas Comando + R simultáneamente mientras inicia su Mac.
Abra el terminal desde el menú Utilidades, escriba
csrutil disable
, luego presione Intro. Vaya al menú de Apple para reiniciar.SIP estaría desactivado de ahora en adelante. Lo desactivé hace mucho tiempo y no he notado nada malo, algunos procesos parecen quejarse, pero siempre lo hacen en OS X, así que no estoy seguro de si es causado por la falta de 'protección' de integridad del sistema
Mi consejo es deshacerse por completo de SIP y / o usar homebrew para todo su software de código abierto / desarrollo. Homebrew utiliza el directorio / usr / local para su instalación y no colisiona con otros componentes del sistema, y las compilaciones de homebrew están más actualizadas que las compilaciones os x apple.
fuente
/System
; fuera de los límites a partir del 10.11. Podemos usar csrutil para deshabilitarlo temporalmente si estamos en apuros, aunque sé que podría parecer que podría convertirse en whack-a-mole, pero esto no parece ser una buena razón para emplearlo. Dejarlo fuera es ... por qué no podemos tener cosas buenas.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
y no tengo una razón para habilitarlo ya que cerré y personalicé mi sistema de manera bastante estrictaUtilizado en su
pip3 install <package>
lugar y resuelto el problema de permiso enpip
.fuente
Créeme, realmente no quieres que la biblioteca escriba nada en ese camino.
Anteriormente no se recomendaba, pero era posible escribir en él
/System/Library/Frameworks/Python.framework/Versions/2.7/
, pero ahora no es compatible debido a Apple SIP y, por lo tanto, es el problema del propietario de la biblioteca. La distribución del paquete debe actualizarse para que funcione correctamente con esta actualización. La mayoría de los paquetes se actualizaron e instalaron su contenido/Library/Python/2.7/site-packages
, pero algunos paquetes no se actualizaron.Para mi caso, era una biblioteca greenlet que intentaba escribir su
.h
archivo en la carpeta System Frameworks:Cómo solucionarlo:
sudo -H pip install greenlet --install-option "--install-headers=/Library/Python/2.7/lib/python/includes/"
luegosudo -H pip install gevent
Para numpy, la solución es
sudo -H pip install --ignore-installed -U numpy
.Para otras bibliotecas, las correcciones varían de https://github.com/pypa/pip/issues/3177 a
pip install --ignore-installed six
ypip install --user
(la última instala todo en /User//Library/Python/2.7/ path). Consulte también la respuesta principal actual a esta publicación: https://apple.stackexchange.com/a/210021/169157Si escribe
python -m site
debe incluirsys.path = [ ... '/Library/Python/2.7/site-packages', ... ]
antes de las rutas del sistema, es por eso (y cómo) funciona.fuente
Lo hice de la siguiente manera:
luego, después de instalar Python:
fuente
brew install python
Ya instala pip con él. Si luego instala pip mediante easy_install, es probable que termine con dos instalaciones de pip que pueden generar problemas confusos.Una solución genial para este problema es usar virtualenv (virtualenvwrapper), después de crear un nuevo entorno para su proyecto, puede usar pip sin problemas, así que usé virtualenvwrapper y estas dos líneas solucionan el problema:
fuente
pip install virtualenv
o pip no funciona y necesita recurrir asudo easy_install
+1 para lo que ya está aquí. Saludossudo easy_install
funcionaTengo Python3 instalado en mi Mac, mientras que el Python2.7 original viene con OSX. Entonces, cada vez que quiero invocar el python3, simplemente escribo $ python3 ... Tal vez deberías probar $ python3 get-pip.py, esto funciona para mí cuando tengo casi el mismo problema contigo.
fuente
Resumen
Llegué a este problema en Mac OS X 10.11.6 (que tiene SIP) porque instalé pip usando System easy_install, y el local easy-install.pth se refería a las bibliotecas del sistema.
Al instalar paquetes posteriores con pip, algunas de las dependencias se resolvieron en las bibliotecas más antiguas de System Python.
La solución fue eliminar mis bibliotecas instaladas localmente y reinstalar una versión local de Python (que incluye pip) de https://www.python.org/downloads/ para que el Sistema y las instancias de Python instaladas localmente se mantengan separadas.
Intenté usar la corrección fix_mac_path.pth en la respuesta de @mfripp, sin embargo, encontré la eliminación y reinstalación del limpiador.
Porque
(No sigas estos pasos)
Llegué a este problema al intentar instalar Ansible. Seguí los documentos de Ansible para la instalación en OS X a través de pip
Primero instalé pip con
sudo easy_install pip
Esto usé el sistema easy_install at
/usr/bin/easy_install
e instalé pip en/Library/Python/2.7/site-packages/pip
Recibí advertencias de la siguiente manera al instalar pip pero las ignoré y seguí a ciegas.
Mirando más tarde
/Library/Python/2.7/site-packages/easy-install.pth
, se veía asíLuego instalé ansible a través de pip
Recibí mensajes para decir que las bibliotecas del sistema ya cumplían los requisitos
Luego, cuando ejecuto ansible, tengo este problema
y un pip check reveló que paramiko requería unas herramientas de configuración más nuevas
Tenga en cuenta que ansible solo requiere herramientas de configuración (sin versión) y, por lo tanto, pip informó la dependencia satisfecha por las herramientas de configuración del sistema.
Solución
Lo resolví desinstalando cualquier biblioteca local de Python usando el proceso insinuado en https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython
Para mí esto involucró
Luego eliminé los enlaces simbólicos y los ejecutables en / usr / local / bin como
y así. También eliminé cualquier aplicación
Luego descargué el paquete de instalación 2.7.13 para Mac OS X desde https://www.python.org/downloads/ y lo instalé.
Esto instaló un python local y pip at
/Library/Frameworks/Python.framework/Versions/2.7
y enlaces simbólicos en los/usr/local/bin
que está separado de las bibliotecas del sistema en/System/Library/Frameworks/Python.framework
y/usr/bin
así obtengoy en
pip list
ansible ahora funciona para mí
fuente
Para mí,
PATH
había desaparecidopip
, esto se confirmó ejecutandopython -m pip
Dos posibles soluciones aquí, agregue de
pip
nuevo aPATH
. Depip
todos modos, en mi caso estaba desactualizado, por lo que la actualización lo solucionó:python -m pip install --upgrade pip
✗ pip --version pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
fuente