Можно использоватьpyenvдля установки и переключения между несколькими версиями Python, что полезно при разработке и тестировании программного обеспечения, ориентированного на версии Python, которые не являются просто последними. Одной из зависимостей этих установок Python является readline, которая устанавливается brew.
Проблема, которую я обнаружил, заключается в том, что brew периодически берет на себя установку новой версии readline. Хотя в системе может присутствовать несколько версий readline, только одна из них имеет символическую ссылку в /usr/local/opt/readline.
Если brew обновляется до новой версии readline, Python внезапно начинает выдавать текст, как ^[[A
при попытке использовать клавиши курсора для редактирования строки. Если вы затем попытаетесь сделать это явно, import readline
вы увидите ошибку вроде этой:
>>> 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
Он ищет /usr/local/opt/readline/lib/libreadline.7.dylib
. Проблема, по-видимому, в том, что при pyenv install
сборке Python /usr/local/opt/readline
была символическая ссылка, /usr/local/Cellar/readline/7.0.5
содержащая lib/libreadline.7.dylib
. Этот файл все еще присутствует! Но он больше не доступен по этому пути, так как brew обновил символическую ссылку, чтобы она указывала на версию 8.
Я могу brew switch readline 7.0.5
снова поменять их местами, и Python pyenv снова заработает. Но теперьHomebrew'sPython сломан примерно таким же образом. Есть ли какой-то разумный способ заставить их сосуществоватьи не сломаться снова спонтаннов следующий раз, когда Homebrew установит новую версию readline?
решение1
Я не нашел readline 7 в /usr/local/opt/readline/lib/
папке, но нашел только libreadline.8.0.dylib
. Я решил проблему с помощью этого решения.
По сути, вам просто нужно создать мягкую ссылку:
sudo ln -s libreadline.8.0.dylib libreadline.7.dylib