OSX El Capitan: sudo pip install OSError: [Errno: 1] Operación no permitida

127

Cuando corro:

sudo pip install ipython

Obtuve el siguiente error

OSError: [Errno: 1] Operación no permitida: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

El último comando ejecutado intenta crear el directorio dado anteriormente.

Además, el siguiente comando no puede instalar iPython sin proporcionar ningún error.

sudo pip install --user python

(Estoy en Mac OS X El Capitan en caso de que otras personas en este sistema operativo vean el mismo problema).

Milad M
fuente
He agregado una respuesta que explica cómo modificar su $PATHpara que pueda llamar a los ejecutables para los paquetes de usuario instalados. stackoverflow.com/a/47102398/117471
Bruno Bronosky
2
No deberías usar sudocon --user. Lo que --userhace es instalar en ~/Librarylugar de /Libraryno tener que usar sudopara instalar allí. Pero una vez que instala con sudo, los directorios y archivos son propiedad de todos root. Entonces tienes que usar sudopara hacerles cualquier otra cosa. Lo que a su vez requerirá que lo uses sudopara otras cosas para las que no deberías usarlo. Entonces, incluso un error honesto puede pasar de arrojar un error a destruir datos.
Bruno Bronosky el

Respuestas:

205

Las instrucciones que dicen sudo pip installson inherentemente incorrectas.

Si hay algún tutorial que diga que debe hacer sudo pip, presente un error en este paquete. El autor está deseducando a la comunidad de Python, ya que el tiempo ha demostrado sudo pipser una práctica rota.

OSX El Capitan introdujo un mecanismo para evitar dañar los archivos del sistema operativo . /System/Library/Frameworks/Python.framework/Versions/2.7/shareEs uno de los lugares protegidos. Un usuario normal no tiene ninguna razón para poner o escribir ningún archivo allí . Esto se debe a que el sistema operativo en sí depende de estos archivos y sudo pip, con toda la fuerza dada por lo anterior, los sobrescribirá incondicionalmente. Por lo general, las cosas malas no sucederían, pero las posibilidades están ahí. Apple quiere proteger a los usuarios de su sistema operativo para que bloqueen accidentalmente su instalación.

En su lugar, debe instalar un paquete de Python, como IPython, localmente en la carpeta de inicio de su usuario . La forma más fácil es crear un entorno virtual , activarlo y luego ejecutar pip en el entorno virtual.

Ejemplo:

cd ~  # Go to home directory
virtualenv my-venv
source my-venv/bin/activate
pip install IPython

Más información

Alternativamente, uno debería poder hacer pip install --user. Pero nuevamente, no se necesita sudo y debe configurar manualmente PATHla variable de entorno.

Mikko Ohtamaa
fuente
55
Si no se desea virtualenv y desea instalar globalmente (por ejemplo, /Library/Python/2.7/site-packages) instalar módulos, pruebe mi solución a continuación usando easy_install stackoverflow.com/a/33463702/3078330
smat88dd
3
¿Tiene una cita para esta perspectiva de que 'sudo pip' es malo ("ya que el tiempo ha demostrado que sudo pip es una práctica rota")? No veo ninguna discusión sobre sudo en las citas que da y el tutorial enumera el primer paso para crear virtualenvs como 'pip install virtualenv', que parece crear una dependencia circular tratando de seguir sus consejos.
Von
1
@Von: pip install virtualenvya no debería ser necesario para Python 3.4+, ya que vienen con el python -m venvequivalente virtualenv incorporado . docs.python.org/3/library/venv.html
Mikko Ohtamaa
29
Con el debido respeto, eso no aborda la pregunta original. Estoy tratando de instalar IPython y ponerlo a disposición global (para todos los usuarios de mi máquina), y no tengo virtualenv ni pip install --user IPythonayuda con eso. Además, pip install --user IPythonno puede colocar el ipythoncomando en $PATH(al menos en mi máquina).
jpetazzo
3
Me enseñaste y también me ahorraste tiempo. Muchas gracias. ¡Dejé de usar sudo y todo funcionó! Gran respuesta.
Parth Gupta
24

Tuve los mismos problemas, pero el uso me easy_install "module"resolvió el problema.

No estoy seguro de por qué, pero pip y easy_install usan diferentes ubicaciones de instalación, y easy_install eligió las correctas.

Editar: sin volver a verificar pero debido a los comentarios; parece que diferentes instalaciones (OSX e instaladas en brew) interfieren entre sí, por lo que las herramientas mencionadas apuntan a diferentes ubicaciones (ya que pertenecen a diferentes instalaciones). Entiendo que generalmente esas herramientas de un punto de instalación a la misma carpeta.

smat88dd
fuente
¿Tiene instalados dos intérpretes de Python diferentes y easy_installestá configurado para otro?
Mikko Ohtamaa
Tengo instalados 2-3 pitón versiones diferentes, pero tengo easy_installpara todos ellos: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd
Lo más probable pipy easy_installapuntan a diferentes Python. Puede resolver esto con el whichcomando UNIX y luego averiguar el pipcomando correcto para usar.
Mikko Ohtamaa
1
¿Podría ser una instalación previa desde OSX anterior antes de la actualización?
Mikko Ohtamaa
1
pip y easy_install usan diferentes ubicaciones de instalación ; no, usan exactamente las mismas ubicaciones. Se trabajó por accidente, ya @MikkoOhtamaa estaba tratando de mostrar en sus comentarios. Esto claramente no responde.
Piotr Dobrogost
19

Deberías reinstalar Python:

brew reinstall python

Para obtener cerveza, vea la página de inicio de cerveza .

david euler
fuente
Yo segundo. corro, brew install pythonentonces creo pipque ya está en su lugar. Después de que la pipinstalación funcionó (tuve problemas similares con los permisos y el rescate de pip en las instalaciones)
travellingbones
15

pip install --ignore-installed six

Esto hará el trabajo, entonces puedes probar tu primer comando.

Vía http://github.com/pypa/pip/issues/3165

Alireza Samar
fuente
En mi caso, también tuve que hacerlo pip install --ignore-installed setuptools.
ithos67
2
No, esto no hará el trabajo debido a la falta de permisos.
Piotr Dobrogost
11

En su pip3 install <package>lugar, se utilizó y resolvió el problema de permisos con pip.

Keng
fuente
10
FYI, esto funcionó porque pip3usa Python 3, que generalmente es instalado por el usuario. Python 2 (2.7), por otro lado, se envía con macOS y está protegido como explica la respuesta mejor calificada.
Khanh Nguyen
10

TL; corrección de DR $ PATH

  1. Se usa pip install --user package_namepara instalar un paquete que debe incluir ejecutables de la CLI.
  2. Lanza un shell de python y import package_name
  3. Encuentre dónde lib/python/...ocurre en la salida y reemplácelo todo conbin
  4. Es probable que sea $HOME/Library/Python/2.7/bin

Detalles

Debido a la nueva Protección de integridad del sistema en macOS 10.11 El Capitan, ya no puede sudo pip install . No discutiremos los méritos de eso aquí.

Otra respuesta explica que deberías pip install --usercuál es la correcta. Pero lo enviaron a los callejones traseros para averiguar qué hacer con usted $PATHpara que pueda acceder a los archivos ejecutables instalados. Afortunadamente, ya he resuelto una necesidad similar de una pregunta no relacionada .

Aquí hay una transcripción de cómo resolví el problema en uno de mis sistemas. Lo incluyo todo en lugar de lo $PATHque funcionó para mí, porque su sistema puede ser diferente al mío. Este proceso debería funcionar para todos.

$ pip install --user jp
Collecting jp
  Downloading jp-0.2.4.tar.gz
Installing collected packages: jp
  Running setup.py install for jp ... done
Successfully installed jp-0.2.4

$ python -c 'import jp; print jp'
<module 'jp' from '/Users/bbronosky/Library/Python/2.7/lib/python/site-packages/jp/__init__.pyc'>

$ find /Users/bbronosky/Library/Python -type f -perm -100
/Users/bbronosky/Library/Python/2.7/bin/jp

$ which jp

$ echo -e '\n''export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bashrc

$ bash # starting a new bash process for demo, but you should open a new terminal

$ which jp
/Users/bbronosky/Library/Python/2.7/bin/jp

$ jp
usage: jp <expression> <filepath>
Bruno Bronosky
fuente
10

Mismo error

Installing collected packages: six, pyparsing, packaging, appdirs, setuptools
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 323, in clobber
    shutil.copyfile(srcfile, destfile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/six.py'

y aquí uso --usersin sudoresolver este problema

$ pip install --user scikit-image h5py keras pygame
Collecting scikit-image
  Downloading http://mirrors.aliyun.com/pypi/packages/65/69/27a1d55ce8f77c8ac757938707105b1070ff4f2ae47d2dc99461bfae4491/scikit_image-0.13.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (28.1MB)
    100% |████████████████████████████████| 28.1MB 380kB/s
Collecting h5py
  Downloading http://mirrors.aliyun.com/pypi/packages/b7/cc/1c29b0815b12de2c92b5323cad60f724ac8f0e39d0166d0b9dfacbcb70dd/h5py-2.7.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.5MB)
    100% |████████████████████████████████| 4.5MB 503kB/s
Requirement already satisfied: keras in /Library/Python/2.7/site-packages
Requirement already satisfied: pygame in /Library/Python/2.7/site-packages
Requirement already satisfied: matplotlib>=1.3.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from scikit-image)
Requirement already satisfied: six>=1.7.3 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: pillow>=2.1.0 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: networkx>=1.8 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: PyWavelets>=0.4.0 in /Library/Python/2.7/site-packages (from scikit-image)
Collecting scipy>=0.17.0 (from scikit-image)
  Downloading http://mirrors.aliyun.com/pypi/packages/72/eb/d398b9f63ee936575edc62520477d6c2353ed013bacd656bd0c8bc1d0fa7/scipy-0.19.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.2MB)
    100% |████████████████████████████████| 16.2MB 990kB/s
Requirement already satisfied: numpy>=1.7 in /Library/Python/2.7/site-packages (from h5py)
Requirement already satisfied: theano in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: pyyaml in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: python-dateutil in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: tornado in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: pyparsing>=1.5.6 in /Users/qiuwei/Library/Python/2.7/lib/python/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: nose in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: olefile in /Library/Python/2.7/site-packages (from pillow>=2.1.0->scikit-image)
Requirement already satisfied: decorator>=3.4.0 in /Library/Python/2.7/site-packages (from networkx>=1.8->scikit-image)
Requirement already satisfied: singledispatch in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: certifi in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: backports_abc>=0.4 in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Installing collected packages: scipy, scikit-image, h5py
Successfully installed h5py-2.7.0 scikit-image-0.13.0 scipy-0.19.0 

¡Espero que ayude a alguien que encuentre un problema similar!

GoingMyWay
fuente
3
No deberías usar sudocon --user. Lo que --userhace es instalar en ~/Librarylugar de /Libraryno tener que usar sudopara instalar allí. Pero una vez que instala con sudo, los directorios y archivos son propiedad de todos root. Entonces tienes que usar sudopara hacerles cualquier otra cosa. Lo que a su vez requerirá que lo uses sudopara otras cosas para las que no deberías usarlo. Entonces, incluso un error honesto puede pasar de arrojar un error a destruir datos.
Bruno Bronosky el
9

Tuve los mismos problemas. Como otros han mencionado, no ejecutes pip install con sudo. correr

brew doctor 

y corrija las advertencias y debería poder continuar con la instalación de su pip.

apadana
fuente
6

Es difícil hacer que pip trabaje en El Capitán por varias razones:

  1. OS X no establece correctamente algunas variables distutils, por lo que pip intenta instalar archivos auxiliares en las ubicaciones siguientes /System/Library/. El Capitán bloquea esto, que es el error con el que te estás encontrando.
  2. OS X incluye una serie de paquetes obsoletos en /System/Library/. pip a menudo quiere actualizar estos pero no puede en El Capitan.
  3. OS X ocupa /System/Library/un lugar más alto en el orden de búsqueda de Python que /Library/Python/2.7/site-packages(la ubicación del paquete de Python en todo el sistema), por lo que incluso si logra instalar versiones más nuevas de algunos paquetes, los antiguos aún se cargan, rompiendo algunas dependencias.

Hay soluciones para todos estos en https://apple.stackexchange.com/a/223163/143849 . Pero es mejor que instales tu propia versión de Python a través del instalador estándar de Python, Homebrew o Anaconda.

Matthias Fripp
fuente
4

Supongo que tienes algún conflicto con otro paquete. Para mí lo fue six. Entonces necesita usar un comando como este:

pip install google-api-python-client --upgrade --ignore-installed six

o

pip install --ignore-installed six

Ruhul Amin
fuente
3
¿Qué parte de la respuesta dada por @MikkoOhtamaa no entiendes que aún sugieres usar sudo con pip ?
Piotr Dobrogost
@PiotrDobrogost, ¿por qué no lees correctamente antes de preguntar? Mi respuesta es con respecto six.
Ruhul Amin
3
De nuevo, ¿qué parte de la respuesta dada por @MikkoOhtamaa no entiendes que aún sugieres usar sudo con pip ?
Piotr Dobrogost
1

Estoy totalmente de acuerdo con Mikko, pero si aún quieres hacerlo, esta es la forma:

  • Reiniciar en modo de recuperación (Mantener cmd + R)
  • Abrir terminal desde utilidades
  • Usa el comando csrutil disable
gilliM
fuente
66
Este podría ser un consejo peligroso sin explicar las implicaciones de deshabilitar la Protección de integridad del sistema. Una consideración es la expectativa de que nunca volverá a funcionar correctamente si no lo vuelve a habilitar con relativa rapidez, al igual que Windows UAC y Virtualization.
Andy Magoon
0

Tengo python2.7 instalado a través de brew y lo siguiente resolvió mi problema

instalar cerveza numpy

Instala python3, pero aún funciona y lo configura para 2.7 también.

Aerodyno
fuente
Trabajado sin problemas. ¡¡Gracias!!
NightFury