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:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
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 es OSError: [Errno: 1]
, pero viene después de un mensaje como Uninstalling 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.
- ¿Desea continuar utilizando la versión Mac OS X de Python o instalar la suya propia? Instalar la suya es la opción más segura, y se puede hacer a través del instalador oficial de Python, Homebrew o Anaconda. Esto también es lo que recomienda Apple , como lo señaló @Sacrilicious . Si instala su propia versión de Python, probablemente debería desinstalar todo lo que esté instalado actualmente
/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á ejecutar pip 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 :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
O use este comando para instalar pip solo para su propia cuenta de usuario :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
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 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Si usas habitualmente sudo -H pip ...
, debes colocar este archivo en /var/root
(directorio de inicio para el usuario root). Si usas habitualmente sudo 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:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
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:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
Luego ponga el siguiente código en fix_mac_path.pth
la ubicación especificada arriba:
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 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:
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
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:
sudo -H pip install <package>
Para su propio usuario:
pip install --user <package>