在Python shell中按箭头键时出现转义字符

236
在交互式 Python shell 等类似 shell 中,通常可以使用箭头键在当前行移动或获取先前的命令(使用上箭头键等)等。但是当我通过 ssh 连接到另一台机器并在其中启动 python 时,我会得到这样的会话:
>>> import os 
>>> ^[[A    

最后一个字符来自于箭头向上。或者,使用箭头向左:

>>> impor^[[D

我该如何修复这个问题?

在常规的Bash中,箭头键工作正常。只有在交互式Python(或Perl等)shell中才会出现奇怪的行为。


我认为这应该放在Server Fault上。这是由于终端类型不正确引起的。 - epochwolf
我同意下面Cartman的观点,这不是终端类型问题,而是readline问题。 - Frank
2
在Mac上,easy_install readline再加上easy_install ipython非常完美。 - gnuyoga
安装Anaconda2或Anaconda3并设置.pystartup,请参见链接:https://stackoverflow.com/questions/48134649/how-to-set-configuration-for-readline-in-python?noredirect=1#comment83246563_48134649 - Leon WANG
2
@LeonWANG 给出了一个不好的答案 - 不要安装像anaconda这样巨大的东西,只是为了让你的.pystartup文件工作。完全没有必要。 - jdogg
25个回答

135

我通过安装readline软件包解决了这个问题:

pip install readline

32
我必须在我的Ubuntu机器上安装libncurses-dev,然后readline才能正确安装。 - Amir Eldor
8
在CentOS上安装了 ncurses-devel,然后顺利安装了 readline。交互式 shell 现在可以正常使用了。 - one.time
4
我无法在我的OS X机器上使用pip install readline进行安装,即使我已经成功执行了brew install readline,每次都会失败。 - user5359531
27
我必须安装 gnureadline,请参见 https://dev59.com/AFgQ5IYBdhLWcg3wRR9j。 - The Guy with The Hat
5
@TheGuywithTheHat: 我这边也遇到了同样的问题。我尝试在运行Raspberry Pi的计算机上安装readline,使用命令sudo pip3 install readline,但是当我在Python命令提示符下输入一个命令时,Python崩溃了。我不得不卸载readline并安装gnureadline代替。现在一切都很顺利…赞同你的建议! - GeertVc
显示剩余11条评论

85

在 OS X 上,我遇到了不同的问题。

当我使用系统 python shell 时,键盘输入没有问题,但在虚拟环境中存在问题。我尝试重新安装/升级 virtualenv/readline ,但都没有解决问题。

当我尝试在有问题的 python shell 中导入 readline 时,会得到以下错误消息:

ImportError: No module named readline
ImportError: dlopen(/Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
Referenced from: /Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so
Reason: image not found

因为存在 /usr/local/opt/readline/lib/libreadline.7.dylib 但不存在 libreadline.6.dylib,所以我建立了一个符号链接:

因为存在/usr/local/opt/readline/lib/libreadline.7.dylib但不存在libreadline.6.dylib,所以我建立了一个符号链接:

ln -s libreadline.7.dylib libreadline.6.dylib

问题已经解决了!


在不断地查找之后,我终于通过这个建议解决了问题。谢谢! - gl051
1
如果某些东西调用了v6,却没有意识到它实际上是v7,这难道不会引起问题吗? - Adam Barnes
4
我曾遇到同样的问题,但我并没有按照那些指示操作,而是输入了brew update && brew upgrade。目前还不清楚这个操作是否会影响PHP。 - Adam Barnes
@AdamBarnes 这对我也起了作用。我也使用pyenv,所以在升级所有homebrew软件包后,确保卸载/重新安装我需要的python版本。 - funseiki
3
我没有libreadline.7.dylib(可能是因为我使用的是Mojave 10.14.x,然后更新了XCode 10.2.1),但我有版本8。执行ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib修复了扫描代码的问题,但无法恢复历史命令回忆。虽然在这种情况下,半个修复总比没有要好。(是的,我也添加了一个6的链接,但没有任何区别)。 补充说明:这只是对于我使用的Python2存在的问题。我的Python3没有问题,不需要使用链接。 - Zim
显示剩余5条评论

53

在OS X上,Xcode更新有时会破坏readline。解决方案:

brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline

如果问题仍然存在,请尝试使用pip删除readline,并使用easy_install进行安装:

pip3 uninstall readline
easy_install readline

3
@user5359531 我已经更新了答案,并提供了一个 easy_install 选项。 - Max Malysh
对于Python 3.4,“easy_install-3.4 readline”解决了这个问题。 - Karioki
1
我使用 easy_install 没有问题,但使用 pip 就不行。 - justhalf
1
这个与 brew link readline 结合使用(即使它已经被链接了)对我来说解决了问题。 - Richard Rast
这种方法对我也起作用,解决了在MacOS上Python readline包(需要底层操作系统readline的v7版本)和操作系统级别的readline包(仅提供v8)之间的版本不一致问题。 - Andreas Maier
显示剩余2条评论

42

在OS X上,使用Python 3.5和virtualenv。

$ pip install gnureadline
在解释器中执行以下操作:
import gnureadline

现在箭头键应该可以正常工作了。


附加信息...

请注意,自2015年10月1日起 - readline已被弃用(来源:https://github.com/ludwigschwardt/python-readline

请改用gnureadline(参见:https://github.com/ludwigschwardt/python-gnureadline

如果我在Python 3.5中安装readline而不是gnureadline,那么在尝试在解释器中导入后会收到错误:

>>> import readline
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
  Reason: image not found

这个可以用,_但是_这意味着我需要在每个交互式会话的顶部添加import gnureadline,这真的很烦人。有没有一种方法可以在每个交互式会话开始时启动它? - Anton Codes
1
@Panchishin 尝试使用 PYTHONSTARTUP 环境变量来命名一个文件,在交互提示符显示之前执行 Python 命令(例如 import gnureadline)。有关其他可能的想法,请参见:run python command line interpreter with imports loaded automatically - user12345

40

看起来 readline 没有启用。检查是否定义了 PYTHONSTARTUP 变量,对我来说,它指向 /etc/pythonstart,并且在进入交互模式之前,Python 进程会执行该文件,从而设置 readline/history 处理。

感谢 @chown 提供的文档: http://docs.python.org/2/tutorial/interactive.html


1
经过一些谷歌搜索,似乎在该系统上使用Python可能需要重新编译,在安装readline-devel之后。 - Frank
1
环境变量是 PYTHONSTARTUP,而不是 PYTHONSTART。不确定与发行版相关的 /etc/pythonstart 文件。 - Ned Deily
你介意展示一下你的/etc/pythonstart文件的脚本内容吗?这样我们就可以看到它是如何设置readline和history的。 - chown
1
实际上,阅读http://docs.python.org/2/tutorial/interactive.html可以提供编写pystartup文件所需的所有信息。 - chown
7
在使用brew安装的OSX系统上,我只需要运行brew reinstall python3即可重装Python3。 - Ranhiru Jude Cooray
显示剩余2条评论

28

我最近遇到了这个问题,经过大量阅读关于pip install readline(无法在Mac OSX上使用)和pip install gnureadline并不满意之后,现在我的设置可以使箭头键在任何Python控制台中使用:

  1. 使用pip install gnureadline安装gnureadline。

现在您可以执行import gnureadline,箭头键应该按预期工作。要使它们自动工作,请按照以下步骤执行:

  1. 创建(或附加到)文件~/.startup.pyimport gnureadline
  2. 追加到文件~/.bash_profileexport PYTHONSTARTUP=~/.startup.py

有一件事不起作用,但是在我以前的设置中起作用的是:pdb.set_trace()上的gnureadline的自动导入。 如果有人有解决此问题的好方法,我将感激您的评论。


22

我在Ubuntu 16.04 LTS上使用Python 3.6.x时,遇到了shell历史记录(tab/arrows命令)的问题。

我是从源代码安装的Python 3.6.x。

像user12345建议的那样,通过以下命令行安装"gnureadline"模块解决了我的问题:


```bash pip install gnureadline ```
sudo pip3.6 install gnureadline

:)


1
我尝试了所有其他解决方案,但这个对于我的Python 3.6有效。 - Umair Ayub
2
确保在shell中调用import gnureadline以使其正常工作。 - David Schumann
4
不需要使用sudo。 - Newalp

17
  1. 安装readline-devel包。
  2. 重新编译带有readline模块的Python。
  3. 完成!

2
感谢您提高了我的生活质量!{;-)}在Centos 5.5上,只需yum install readline-devel,您就不必在重新编译中显式指定readline。 - michela
3
我们如何重新编译Python?我需要从源代码安装提取Python(./configure,make,make install),设置虚拟环境并重新安装所有软件包吗? - Muhammad Waqar

12

这是我在Ubuntu 12.04和Python 3.3上成功的步骤:

1)打开终端并输入sudo apt-get install libreadline-dev

2)从http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz下载Python 3.3.2源文件

3)在shell中提取并导航至Python-3.3.2/目录

4)执行以下命令:

./configure
make
make test
sudo make install

7

我在升级到High Sierra之后受到了影响,但我成功地解决了这个问题:

brew unlink python
xcode-select --install
brew install python

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接