Es posible utilizarpienvpara instalar y cambiar entre múltiples versiones de Python, lo cual es útil cuando se intenta desarrollar y probar software dirigido a versiones de Python que no son solo las más recientes. Una de las dependencias de estas instalaciones de Python es readline, que se instala mediante brew.
El problema que he encontrado es que Brew periódicamente se encarga de instalar una nueva versión de readline. Aunque pueden estar presentes varias versiones de readline en el sistema, solo una de ellas tiene un enlace simbólico en /usr/local/opt/readline.
Si Brew actualiza a una nueva versión de readline, de repente Python comienza a escupir texto como ^[[A
cuando intenta usar las teclas del cursor para editar líneas. Si luego intenta hacerlo explícitamente, import readline
verá un error como este:
>>> import readline
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/********/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
Referenced from: /Users/********/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so
Reason: image not found
Esta buscando /usr/local/opt/readline/lib/libreadline.7.dylib
. El problema parece ser que cuando pyenv install
se construyó Python, /usr/local/opt/readline
había un enlace simbólico /usr/local/Cellar/readline/7.0.5
que contenía lib/libreadline.7.dylib
. ¡Ese archivo todavía está presente! Pero ya no está disponible en esta ruta, ya que Brew actualizó el enlace simbólico para que apunte a la versión 8.
Puedo brew switch readline 7.0.5
cambiarlos nuevamente y Python de pyenv funcionará nuevamente. Pero ahoracerveza caseraPython se descompone de forma muy parecida. ¿Existe alguna forma sensata de que estos coexistan?y no volver a romperse espontáneamente¿La próxima vez que Homebrew instale una nueva versión de readline?
Respuesta1
No encontré readline 7 en la /usr/local/opt/readline/lib/
carpeta, pero solo encontré libreadline.8.0.dylib
. Resolví el problema con esta solución.
Básicamente, sólo necesitas crear un enlace suave:
sudo ln -s libreadline.8.0.dylib libreadline.7.dylib