Referencias rotas en virtualenvs

Recientemente instalé un montón de archivos de puntos en mi Mac junto con otras aplicaciones (cambié a iTerm en lugar de Terminal, y Sublime como mi editor de texto predeterminado), pero desde entonces, todos mis entornos virtuales han dejado de funcionar, aunque sus carpetas están dentro de .virtualenvs todavía están allí y dan el siguiente error cada vez que bash ejecutar algo en ellos:

dyld: Library not loaded: @executable_path/../.Python Referenced from: /Users/[user]/.virtualenvs/modclass/bin/python Reason: image not found Trace/BPT trap: 5 

He eliminado todos los archivos relacionados con archivos de puntos y he restaurado mi .bash_profile a lo que era antes, pero el problema persiste. ¿Hay alguna forma de diagnosticar el problema o resolverlo de forma sencilla (por ejemplo, no es necesario crear todos los controles virtuales de nuevo)?

Encontré la solución al problema aquí , por lo que todo el crédito es para el autor.

Lo esencial es que cuando creas un virtualenv, se crean muchos enlaces simbólicos en el Homebrew instalado en Python.

Aquí hay un ejemplo:

 $ ls -la ~/.virtualenvs/my-virtual-env ... lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/Python ... 

Cuando actualiza Python usando Homebrew y luego ejecuta brew cleanup , los enlaces simbólicos en virtualenv apuntan a rutas que ya no existen (porque Homebrew las eliminó).

Los enlaces simbólicos deben apuntar al Python recién instalado:

 lrwxr-xr-x 1 ryan staff 78 Jun 25 13:21 .Python -> /usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/Python 

La solución es eliminar los enlaces simbólicos en el virtualenv y luego volver a crearlos:

 find ~/.virtualenvs/my-virtual-env/ -type l -delete virtualenv ~/.virtualenvs/my-virtual-env 

Probablemente sea mejor verificar qué enlaces se eliminarán primero antes de eliminarlos:

 find ~/.virtualenvs/my-virtual-env/ -type l 

En mi opinión, es incluso mejor eliminar solo enlaces simbólicos rotos. Puedes hacer esto usando GNU find :

 gfind ~/.virtualenvs/my-virtual-env/ -type l -xtype l -delete 

Puedes instalar GNU find con Homebrew si aún no lo tienes:

 brew install findutils 

Tenga en cuenta que, de forma predeterminada, los progtwigs GNU instalados con Homebrew suelen tener el prefijo con la letra g . Esto es para evitar seguir el binario de find que viene con OS X.

Después de probar algunas cosas, esto me funcionó:

vaya a su directorio virtualenv (pero no ejecute workon):

 cd ~/.virtualenv/name_of_broken_venv 

Ahora borre estos archivos:

 rm -rf .Python bin/python* lib/python2.7/* include/python2.7 

Luego, para reconstruir tu venv, corre:

 virtualenv . workon name_of_broken_venv pip freeze 

Ahora debería ver una lista de sus paquetes instalados de nuevo.

Esto ocurrió cuando actualicé a Mac OS X Mavericks de Snow Leopard. Tuve que volver a instalar el brebaje de antemano también. Esperemos que haya ejecutado el comando de congelación para su proyecto con pip.

Para resolverlo, debe actualizar las rutas a las que apunta el entorno virtual.

  • Instala una versión de python con brew:

brew install python

  • Reinstalar virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Se eliminó el antiguo entorno virtual:

rmvirtualenv old_project

  • Crea un nuevo entorno virtual:

mkvirtualenv new_project

  • Trabajar en nuevo entorno virtual.

workon new_project

  • Use pip para instalar los requisitos para el nuevo proyecto.

pip install -r requirements.txt

Esto debería dejar el proyecto como estaba antes.

Parece que la forma correcta de resolver este problema es ejecutar

  pip install --upgrade virtualenv 

después de haber actualizado Python con Homebrew.

Este debería ser un procedimiento general para cualquier fórmula que instale algo como python, que tiene su propio sistema de administración de paquetes. Cuando instala brew install python , instala python y pip y easy_install y virtualenv y así sucesivamente. Entonces, si esas herramientas se pueden auto actualizar, es mejor intentar hacerlo antes de considerar a Homebrew como la fuente de problemas.

Si esto fue causado por una brew upgrade que actualizó su Python, y está de acuerdo con la baja a la versión anterior, intente brew switch python [previous version] , por ejemplo, brew switch python 3.6.5 . De aquí.

Una versión actualizada de @Chris Wedgwood es la respuesta para mantener site-packages (mantener los paquetes instalados)

 cd ~/.virtualenv/name_of_broken_venv mv lib/python2.7/site-packages ./ rm -rf .Python bin lib include virtualenv . rm -rf lib/python2.7/site-packages mv ./site-packages lib/python2.7/ 

Si has destruido python3, prueba con brew upgrade python3 que me lo arregló.

Utilizando Python 2.7.10.

Un solo comando virtualenv path-to-env hace. documentación

 $ virtualenv path-to-env Overwriting path-to-env/lib/python2.7/orig-prefix.txt with new content New python executable in path-to-env/bin/python2.7 Also creating executable in path-to-env/bin/python Installing setuptools, pip, wheel...done. 

Recientemente me enfrenté a esto. Ninguna de las soluciones anteriores funcionó para mí. Parece que no era realmente el problema de Python. Cuando estaba corriendo

aws s3 ls

Estaba recibiendo error siguiente:

dyld: Library not loaded: @executable_path/../.Python

Esto significa que el ejecutable de la biblioteca aws está apuntando hacia o bien no existe o está dañado, así que desinstalé y reinstalé aws-cli siguiendo las instrucciones de este enlace y ¡funcionó!

instrucciones virtualenvwrapper

Como se indica en la respuesta aceptada, es probable que la causa raíz sea una actualización de homebrew que significa que los enlaces simbólicos de virtualenv están apuntando a rutas de Python rotas.

Para cada env virtual, debe reasignar los enlaces simbólicos para que apunten a la ruta de Python correcta (en la bodega de cerveza). Aquí es cómo hacerlo con virtualenvwrapper . Aquí estoy actualizando un env virtual llamado “my-example-env”.

 cd ~/PYTHON_ENVS find ./my-example-env -type l -delete mkvirtualenv my-example-env 

Todo listo.

El problema para mí (un usuario de MacOS) es que brew actualizó los enlaces de Python y virtualenvs a la versión anterior que se eliminó.

Podemos comprobarlo y arreglarlo por

 >> ls -al ~/.virtualenvs//.Python .Python -> /usr/local/Cellar/python//Frameworks/Python.framework/Versions/3.7/Python >> rm ~/.virtualenvs//.Python >> ln -s /usr/local/Cellar/python//Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs//.Python 

La respuesta aceptada no me funciona: el archivo $WORKON_HOME/*/bin/python2.7 ya no es un enlace simbólico, es un ejecutable completo:

 $ file $WORKON_HOME/*/bin/python2.7 /Users/sds/.virtualenvs/.../bin/python2.7: Mach-O 64-bit executable x86_64 ... 

La solución es, por desgracia, eliminar completamente y recrear desde cero todos los entornos virtuales.

Para la referencia:

 deactivate pip install --user virtualenv virtualenvwrapper pip install --user --upgrade virtualenv virtualenvwrapper for ve in $(lsvirtualenv -b); do # assume that each VE is associated with a project # and the project has the requirements.txt file project=$(cat $WORKON_HOME/$ve/.project) rmvirtualenv $ve mkvirtualenv -a $project -r requirements.txt $ve done 

Simplemente actualizar python3 funcionó para mí:

 brew upgrade python3 

Lo que lo solucionó fue simplemente desinstalar python3 y pipenv y luego volver a instalarlos.

 brew uninstall python3 brew uninstall pipenv brew install python3 brew install pipenv