Referencias rotas en Virtualenvs

238

Recientemente instalé un montón de archivos de puntos en mi Mac junto con algunas 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 dentro de .virtualenvs todavía están allí y dan el siguiente error cada vez que intento 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 los 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 una manera fácil (por ejemplo, no es necesario crear todos los virtualenvs de nuevo)?

oxtay
fuente
Gracias por el comentario, @unubtu. Esto ciertamente es útil. Pero tampoco soy capaz de hacer ningún nuevo virtualenvs. Mi rmvirtualenvtodavía funciona, pero cuando se trata de correr mkvirtualenv, me sale el siguiente error: -bash: /usr/local/bin/virtualenv: /usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/Resour: bad interpreter: No such file or directory Por lo tanto, parece ser un problema con mis caminos pitón, pero no puedo ver dónde está el problema, ya que se puede ejecutar Python y parece bien.
oxtay
1
[actualización] Puede que haya encontrado el problema, pero no estoy seguro y no estoy seguro de cómo solucionarlo. Parece que todos los virtualenvcomandos están funcionando ahora en teoría, pero dado que hay un problema con Python, no hacen nada. Entonces, el verdadero problema es con la pitón de brew. Y sospecho que la razón se debe a un cambio de nombre en los directorios de Python. Por alguna razón, todos estos comandos están buscando python en la carpeta /usr/local/Cellar/python/2.7.6pero el nombre de la carpeta es en realidad /usr/local/Cellar/python/2.7.6_1.
oxtay
Como soy un novato, no sé lo arriesgado que es cambiar manualmente el nombre de 2.7.6_1 a 2.7.6 y ver qué sucede.
oxtay
Usted debe ser capaz de cambiar el nombre 2.7.6_1a 2.7.6. Si lo peor llegaba a ser peor, podría cambiar el nombre.
unutbu

Respuestas:

370

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

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

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 lo 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 virtualenv y luego recrearlos:

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 aún mejor eliminar solo enlaces simbólicos rotos. Puedes hacer esto usando GNU find:

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

Puede instalar GNU findcon Homebrew si aún no lo tiene:

brew install findutils

Tenga en cuenta que, de manera predeterminada, los programas GNU instalados con Homebrew tienden a tener el prefijo de la letra g. Esto es para evitar sombrear el findbinario que se incluye con OS X.

Ryan Kaskel
fuente
44
+1 gfindfue perfecto, ya que tenía muchos enlaces simbólicos ininterrumpidos (p. Ej., Nodeenv) que no quería eliminar
2Toad
3
Otra forma de eliminar enlaces simbólicos rotos es usar el hallazgo estándar:find -L ~/.virtualenvs/my-virtual-env/ -type l | xargs rm
vdboor
Eliminé todo mi directorio virtualenv. ahora no puedo eliminar enlaces simbólicos. Ninguna de las soluciones mencionadas en esta página me funciona en Mac. sigo recibiendo el mismo error "imagen no encontrada. Abortar trampa: 6"
Aseem
Estos pasos no funcionaron para mí:pip3 freeze dyld: lazy symbol binding failed: Symbol not found: __Py_UnixMain
deed02392
1
Solo para agregar, si el entorno estaba con Python 2, ejecútelo con argumento: de lo virtualenv ~/.virtualenvs/foo -p python2contrario, usará Python 3.
Bohumir Zamecnik
41

Después de intentar algunas cosas, esto funcionó para mí:

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 su venv, ejecute:

virtualenv .
workon name_of_broken_venv
pip freeze

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

Chris Wedgwood
fuente
FWIW, acabo de probar este enfoque después de actualizar a El Capitan y volver a instalar homebrew, y mi lista de paquetes no se conservó.
Ryan
1
con pipenv puede eliminar haciendo pipenv --rmy recrear pipenv shell,pipenv install
Harry Moreno
14

Esto ocurrió cuando actualicé a Mac OS X Mavericks desde Snow Leopard. También tuve que volver a instalar brew de antemano. Con suerte, ejecutó el comando de congelación para su proyecto con pip.

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

  • Instale una versión de python con brew:

brew install python

  • Vuelva a instalar virtualenvwrapper.

pip install --upgrade virtualenvwrapper

  • Se eliminó el antiguo entorno virtual:

rmvirtualenv old_project

  • Cree un nuevo entorno virtual:

mkvirtualenv new_project

  • Trabaja en un 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.

Robert Brisita
fuente
Esto fue hace un tiempo y creo que eventualmente hice algo en este sentido, pero como no había ejecutado 'pip freeze> require.txt' en ese entonces, no era la solución más eficiente. Lección aprendida.
oxtay
13

La @Chris Wedgwoodrespuesta de una versión de actualización 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/
WeizhongTu
fuente
1
Esto está más allá de la perfección. Ayuda a migrar la versión de Python mientras conserva todos los paquetes. Si está siguiendo esto, no ejecute las instrucciones de @Chris Wedgewood.
Harish Prasanna
10

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 pythone pipy easy_instally virtualenvy así sucesivamente. Entonces, si esas herramientas pueden actualizarse automáticamente, es mejor intentar hacerlo antes de considerar a Homebrew como la fuente de problemas.

Nate
fuente
Esto funcionó para un problema con setuptools, específicamente: Advertencia: no se puede encontrar la ubicación de svn para setuptools == 0.6c12dev-r88846
Robert Brisita
1
Apliqué esta solución, seguido de ejecución: virtualenv . en mi entorno virtual roto. La versión actualizada de virtualenventonces recreó las dependencias necesarias y estaba listo para comenzar. Este proceso fue más autogestionado y robusto que la respuesta aceptada para mí.
christang
En 2020, esta sigue siendo la respuesta.
scubabuddha
7

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

Ryan
fuente
4

instrucciones de virtualenvwrapper

Como se indica en la respuesta aceptada, es probable que la causa raíz sea una actualización casera que significa que sus enlaces simbólicos virtualenv apuntan a rutas de python rotas; vea los detalles aquí .

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

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

Todo listo.

arcseldon
fuente
4

Cualquiera que esté usando pipenv (¡y debería hacerlo!) Simplemente puede usar estos dos comandos, sin tener el venv activado:

rm -rf `pipenv --venv` # remove the broken venv
pipenv install --dev   # reinstall the venv from pipfile 
Robotnik
fuente
1
también puede usar pipenv --rmen la carpeta de su env y luegopipenv install --dev
Handfeger
2

Si has reventado python3, solo intenta brew upgrade python3que me lo arreglen.

jmoz
fuente
2

Recientemente me enfrenté a esto. Ninguna de las soluciones anteriores funcionó para mí. Parece que en realidad no fue problema de Python. Cuando estaba ejecutando

aws s3 ls

recibía el siguiente error: ¡

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

Esto significa que el awsejecutable de la biblioteca apunta hacia o no existe o está dañado, por lo tanto, desinstalé y reinstalé aws-clisiguiendo las instrucciones de este enlace y funcionó!

thekosmix
fuente
2

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

Podemos verificarlo y arreglarlo

>> ls -al ~/.virtualenvs/<your-virtual-env>/.Python
.Python -> /usr/local/Cellar/python/<old-version>/Frameworks/Python.framework/Versions/3.7/Python
>> rm ~/.virtualenvs/<your-virtual-env>/.Python
>> ln -s  /usr/local/Cellar/python/<new-version>/Frameworks/Python.framework/Versions/3.7/Python ~/.virtualenvs/<your-virtual-env>/.Python
Yihe
fuente
Esto también funcionó para arreglar enlaces rotos después de instalar Python 3.7 en un sistema que tenía Python3.6
lukik
2

Tuve un problema similar y lo resolví simplemente reconstruyendo el entorno virtual con virtualenv .

dorinjj
fuente
Bienvenido a SO. Aunque le agradecemos su respuesta, sería mejor si proporcionara un valor adicional además de las otras respuestas. En este caso, su respuesta no proporciona un valor adicional, ya que otro usuario ya publicó esa solución. Si una respuesta anterior fue útil para usted, debe votarla una vez que tenga suficiente reputación
David Buck
1

Usando Python 2.7.10.

Un solo comando lo virtualenv path-to-envhace. 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.
Ayush Goel
fuente
1

Tuve un entorno virtual roto debido a una reinstalación de Python por parte de Homebrew (por lo tanto, enlaces simbólicos rotos) y también algunas "instalaciones de sudo pip" que había hecho anteriormente. Los consejos de Weizhong fueron muy útiles para solucionar los problemas sin tener que reinstalar paquetes. También tuve que hacer lo siguiente para el problema de permisos mixtos.

sudo chown -R my_username lib / python2.7 / site-packages

P. Gabbur
fuente
Si está complementando las respuestas de otro usuario, debe dejar un comentario para que puedan editar. Buena contribución
Francisco Peters
No tiene suficientes puntos de reputación para comentar una respuesta.
Tyler Smith
1

Virtualenvs están rotos. A veces, la forma más simple es eliminar las carpetas venv y recrear virutalenvs.

auraz
fuente
1

Si usa pipenv, solo pipenv --rmresolver el problema.

ashdaily
fuente
0

La respuesta aceptada no me funciona: el archivo $WORKON_HOME/*/bin/python2.7ya 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 por completo y volver a crear 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
sds
fuente
Supongo que se debe a que esta solución no es obsoleta: acabo de probarla y solucionó mi problema. Además, creo que si no tiene enlaces simbólicos, no verá el error descrito aquí, por lo que este comentario no se convierte en una solución, sino en una distracción. El hecho de que tenga una versión más nueva no significa que todos lo tengan. Esa es mi suposición por qué el
voto negativo
@RafazZ: Espero que ahora sea mejor. Sin embargo, me pregunto por qué sigue siendo un enlace simbólico para ti. Y sí, obtengo ese error porque el virtualenv python está vinculado contra las libs de stock de python.
sds
Creo que el comportamiento predeterminado todavía es crear enlaces simbólicos y necesita un --always-copyargumento para anularlo. Al menos eso es lo que obtuve de la Guía del usuario
RafazZ
@RafazZ: nunca usé --always-copyy tengo archivos regulares :-(
sds
0

Simplemente actualizar Python3 funcionó para mí:

brew upgrade python3
Flavio Wuensche
fuente
0

Probé los mejores métodos, pero no funcionaron, para mí, que intentaban hacer que tox funcionara. Lo que finalmente funcionó fue:

sudo pip install tox

incluso si tox ya estaba instalado. La salida terminó con:

Successfully built filelock
Installing collected packages: py, pluggy, toml, filelock, tox
Successfully installed filelock-3.0.10 pluggy-0.11.0 py-1.8.0 toml-0.10.0 tox-3.9.0
Marco
fuente
0

Lo que me arregló fue simplemente desinstalar python3 y pipenv y luego reinstalarlos.

brew uninstall pipenv
brew uninstall python3
brew install python3 
brew install pipenv
Lord Nikon
fuente
0

Todas las respuestas son geniales aquí, probé un par de soluciones mencionadas anteriormente por Ryan, Chris y no pude resolver el problema, así que tuve que seguir un camino rápido y sucio.

  1. rm -rf <project dir>(o mv <project dir> <backup projct dir>si desea mantener una copia de seguridad)
  2. git clone <project git url>
  3. ¡Siga adelante!

No hay nada nuevo aquí, ¡pero hace la vida más fácil!

avp
fuente
0

Estoy seguro de que llego tarde a la fiesta, pero quiero decir que la resolución de este problema es mucho más simple de lo que se analiza aquí.

Puede regenerar fácilmente el entorno virtual sin tener que eliminar / editar nada. Suponiendo que se llama a su entorno roto env_to_fix, puede hacer lo siguiente:

mkvirtualenv env_to_fix

Esto regenerará los enlaces y arreglará el entorno sin la necesidad de volcar el estado actual en algún lugar y restaurarlo.

Fabiano Francesconi
fuente
0

Me encontré con el mismo problema cuando estaba señalando mi tiempo de ejecución de Python de 2 a 3 en mi Mac, señalando la ruta de alias python a python 3. Luego recreé un nuevo virtualenv y reinstalé los paquetes que necesito para mi proyecto. Para mi caso de uso, he tenido un programa de Python escribiendo en Google Sheet. Limpie algunos paquetes que son diferentes de la implementación de Python 2 y, wa, las cosas comenzaron a funcionar nuevamente.

black_ray
fuente