É possível usarpyenvpara instalar e alternar entre várias versões do Python, o que é útil ao tentar desenvolver e testar software direcionado a versões do Python que não são apenas as mais recentes. Uma das dependências dessas instalações do Python é o readline, que é instalado pelo brew.
O problema que descobri é que o brew periodicamente se encarrega de instalar uma nova versão do readline. Embora múltiplas versões do readline possam estar presentes no sistema, apenas uma delas tem link simbólico em /usr/local/opt/readline.
Se o brew for atualizado para uma nova versão do readline, de repente o Python começa a cuspir texto, como ^[[A
ao tentar usar as teclas do cursor para editar a linha. Se você tentar explicitamente, import readline
verá um erro 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
Está procurando /usr/local/opt/readline/lib/libreadline.7.dylib
. O problema parece ser que, quando pyenv install
construído em Python, /usr/local/opt/readline
havia um link simbólico /usr/local/Cellar/readline/7.0.5
que continha lib/libreadline.7.dylib
. Esse arquivo ainda está presente! Mas não está mais disponível neste caminho, pois o brew atualizou o link simbólico para apontar para a versão 8.
Posso brew switch readline 7.0.5
trocá-los novamente e o Python do pyenv funcionará novamente. Mas agoraCervejaria caseiraPython é quebrado da mesma maneira. Existe alguma maneira sensata de fazer com que estes coexistame não quebrar espontaneamente novamentena próxima vez que o Homebrew instalar uma nova versão do readline?
Responder1
Não encontrei o readline 7 na /usr/local/opt/readline/lib/
pasta, mas só encontrei o arquivo libreadline.8.0.dylib
. Resolvi o problema com esta solução.
Basicamente, você só precisa criar um link virtual:
sudo ln -s libreadline.8.0.dylib libreadline.7.dylib