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

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

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

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

>>> impor^[[D

我该如何解决这个问题?

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


当前回答

我试图在Ubuntu 14.0上构建Python 2.7。您将需要libreadline-dev。然而,如果你从apt-get中获得它,当前版本是6.3,这与Python 2.7不兼容(不确定Python 3)。例如,在先前版本的readline中定义的数据类型“Function”和“CPPFunction”在6.3中已被删除,如下所述:

https://github.com/yyuu/pyenv/issues/126

也就是说,您需要获得readline早期版本的源代码。我从apt-get中安装了libreadline 5.2的库,并为头文件获取了5.2的源代码。把它们放在/usr/include中。

问题终于解决了。

其他回答

您是否使用-t参数调用ssh来告诉ssh为您分配虚拟终端?

从手册页:

- t 强制伪tty分配。这可以用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个-t选项强制分配tty,即使ssh没有本地tty。

此外,您可能还必须按照另一篇文章的建议,在服务器上正确设置TERM环境变量。

在两个不同版本的Ubuntu上,这些答案都不适合我。对我有用的,但不是真正的修复,是将我的python代码包装在rlwrap调用中(在ubuntu存储库中可用):

Rlwrap python mycode.py

在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

我在Python 3.6的shell历史记录(tab/箭头命令)方面有问题。在Ubuntu 16.04 LTS上安装。

Python 3.6。X是从源代码安装的。

我解决的问题是安装模块“gnureadline”,如user12345所说,使用以下命令行:

sudo pip3.6 install gnureadline

:)

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

conda install -c conda-forge readline=6.2