在像交互式python shell这样的shell中,你通常可以使用箭头键在当前行中移动,或者获得之前的命令(向上箭头)等。

但当我ssh到另一台机器并在那里启动python后,我得到了如下会话:

>>> import os 
>>> ^[[A    

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

>>> impor^[[D

我该如何解决这个问题?

在常规bash中,方向键工作正常。奇怪的行为只是在交互的python(或perl等)shell中。


当前回答

在OS X上,我有不同的问题。

当我使用系统python shell,键是没有问题的,但问题在virtualenv。我试着重新安装/升级virtualenv/readline,没有固定的东西。

当我试图在有问题的python shell中导入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。dylib,所以我做了一个符号链接:

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

问题解决了!

其他回答

以下是在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

看起来readline没有启用。检查是否定义了PYTHONSTARTUP变量,对我来说,它指向/etc/pythonstart,该文件在进行交互之前由python进程执行,这设置了readline/history处理。

感谢@chown,这里有这个文档:http://docs.python.org/2/tutorial/interactive.html

在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

对于使用conda的用户,从conda-forge通道安装readline包将解决这个问题:

conda install -c conda-forge readline=6.2

在OS X上,我有不同的问题。

当我使用系统python shell,键是没有问题的,但问题在virtualenv。我试着重新安装/升级virtualenv/readline,没有固定的东西。

当我试图在有问题的python shell中导入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。dylib,所以我做了一个符号链接:

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

问题解决了!