Actualizar las herramientas de configuración en OSX El Capitan

81

Estoy intentando actualizar las herramientas de configuración. Bueno, en realidad estoy tratando de actualizar ansible pero estoy tratando de actualizar las herramientas de configuración y falla. Intentar hacerlo yo mismo también falla. Incluso intentar desinstalarlo falla

$ sudo -H pip install --upgrade setuptools
Collecting setuptools
  Using cached setuptools-18.4-py2.py3-none-any.whl
Installing collected packages: setuptools
  Found existing installation: setuptools 1.1.6
    Uninstalling setuptools-1.1.6:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg/pip/utils/__init__.py", line 315, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 299, in move
    copytree(src, real_dst, symlinks=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree
    raise Error, errors
Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib', "[Errno 1] Operation not permitted: '/tmp/pip-OyTXsR-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib'")]

No tengo la menor idea de lo que está mal. Mirando todos los archivos en /System/Library/Frameworks/Python.framework/Versions/2.7/y debajo de cada archivo es propiedad deroot:wheel

¿Cómo puedo arreglarlo?

gman
fuente
2
No tengo una solución, pero tengo una explicación: probablemente se deba a la nueva protección de integridad del sistema . pip está tratando de modificar cosas donde ya no está permitido, incluso con sudo. Vea esta pregunta . No me he tomado el tiempo de ocuparme de esto todavía. La --useropción de pip es probablemente lo que buscaría. Si encuentra una solución práctica para "actualizar" todo, ¡compártala!
Arthur
Recibo un ipdberror que está vinculado a setuptools. Actualizar setuptools no funciona. Funciona con --user=pythonel error ipdb, pero aún no lo corrige.
R11G

Respuestas:

189

Esto sucede debido a la protección de integridad del sistema introducida en OS X El Capitan.

Agregar --user pythonal comando permitió que esto funcionara.

En otras palabras

pip install --upgrade setuptools --user python
Kof
fuente
2
pip(a diferencia de easy_install) no requiere sudo, ya que le está permitiendo usar al pythonusuario, me aseguré de que funcione.
Kof
1
También funciona en CentOS 7 dentro de un contenedor Docker. Estaba fallando por alguna razón (aunque la misma configuración funcionaba sin este paso antes de mayo de 2016 ...)
geerlingguy
2
No pude hacer que funcionara y no entiendo cómo se supone que funciona la opción --user. Lo que funcionó para mí fue deshabilitar la Protección de integridad del sistema temporalmente mientras actualizaba las herramientas de configuración (en relación con la instalación de ipython) y luego volver a habilitarla después. Para hacer esto: arranque en modo de recuperación (cmd + R), inicie el terminal e ingrese csrutil disable. Reinicie y, después de la actualización, reinicie al modo de recuperación y entre csrutil enable. Después de reiniciar, ipython siguió funcionando bien para mí.
Grav
Puedo ejecutar este comando con éxito, pero no se realiza ninguna actualización. La salida se ve así:Collecting setuptools Using cached setuptools-28.2.0-py2.py3-none-any.whl Requirement already up-to-date: python in /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload Installing collected packages: setuptools Successfully installed setuptools-1.1.6
diidu
Finalmente pude hacer que todo funcionara siguiendo las instrucciones que se dan aquí: apple.stackexchange.com/questions/209572/…
diidu
2

Visión general

El problema son las bibliotecas Python en conflicto, combinadas con la protección de integridad del sistema (SIP) en Mac OS, que protege las bibliotecas Python del sistema.

En mi opinión, la mejor solución es desinstalar y reinstalar su propia instalación de Python y mantenerla separada de las bibliotecas de Python proporcionadas por Mac OS que están protegidas por SIP.

Yo prefiero esto a deshabilitar SIP ya que espero que SIP sea parte de cualquier versión futura de Mac OS y SIP no es la causa aquí, solo expone el problema de las bibliotecas Python en conflicto.

Detalles

También tuve este problema al intentar instalar ansible.

Mi problema comenzó cuando seguí las instrucciones de instalación ansible para Mac OS, que es instalar a través de pip e instalar pip con easy_installcomo se describe en Últimas versiones a través de Pip

El problema es que al instalar pip de esta manera, el easy_installMac OS se proporciona easy_installen /usr/bin/easy_installpero escribe en el easy-install.ptharchivo en /Library/Python/2.7/site-packages/easy-install.pthy ese archivo hace referencia a las bibliotecas Python proporcionadas por Mac OS.

Posteriormente, la instalación de ansible with pip install ansiblenotifica que el requisito de setuptools está satisfecho con la biblioteca Python proporcionada por Mac OS en /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Ansible requiere setuptools pero no especifica una versión. Otro paquete dependiente, paramiko, requiere setuptools> = 11.3, pero esto no parece estar marcado al instalar ansible a través de pip. Cuando intenta ejecutar ansible, aunque se queja de que las herramientas de configuración son 1.1.6. Esta es la versión de las herramientas de configuración proporcionadas con Mac OS, y ahora está protegida por SIP, por lo que no se puede actualizar.

En lugar de deshabilitar SIP, arreglé esto desinstalando mi Python local como se indica en https://docs.python.org/2.7/using/mac.html#getting-and-installing-macpython y luego descargándolo e instalando nuevamente.

Si le preocupa el rm, puede mv en su lugar
Para desinstalar lo que hice

sudo rm -rf /Library/Python
sudo rm -rf /Applications/Python\ 2.7/
sudo rm /usr/local/bin/ansible  # executable
sudo rm /usr/local/bin/python*  # symlinks to /Library/Python/2.7
sudo rm /usr/local/bin/easy_install*
# and so on for references to /Library/Python/2.7 in /usr/local/bin

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.7y symlinks /usr/local/bin, además de anteponer /Library/Frameworks/Python.framework/Versions/2.7a my $ PATH. Esto mantiene todo separado de las bibliotecas proporcionadas por Mac OS en /System/Library/Frameworks/Python.frameworky /usr/bin para que obtenga

which pip
/Library/Frameworks/Python.framework/Versions/2.7/bin/pip

Luego instalé ansible con pip install ansible
Luego, cuando ejecuto which ansible, obtengo

/Library/Frameworks/Python.framework/Versions/2.7/bin/ansible

y en pip list

setuptools (28.8.0)
six (1.10.0)

y ansible ahora funciona para mí porque la nueva instalación no hace referencia a las bibliotecas Python de Mac OS.

Tenga en cuenta que debido a la configuración del instalador $ PATH, which pythonahora es /Library/Frameworks/Python.framework/Versions/2.7/bin/pythony /usr/local/bin/pythones un enlace simbólico a esto.
Si desea el sistema Python, tendrá que usar / usr / bin / python o cambiar $ PATH

Jason S
fuente
1

La respuesta es que no puede actualizar las herramientas de configuración en OSX para el python de fábrica que se envía con el sistema operativo. El motivo es que /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonel usuario no puede eliminar ni modificar los archivos de . No solo el usuario normal, sino que incluso si tiene permisos de root, no podrá modificar esos archivos.

Seguro que puede utilizar otros métodos para instalar una versión más reciente de setuptools, pero esto no anulará el paquete del sistema predeterminado. Lo que significa que si sigue la ruta sugerida de usar la --user pythonbandera, o elige instalarlos sin root ~/Library, estos no anularán la versión de los archivos del sistema.

La razón por la que usted o root no pueden modificar los valores predeterminados del sistema se debe a las restricciones de permisos SIP en El Capitan +. Puede desactivar SIP, pero generalmente no se recomienda.

En cambio, la única solución razonable es usar un virtualenv de python.

IK
fuente