按下python shell中的箭头键时看到转义字符

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

但是当我进入另一台机器并启动python ,我得到如下的会话:

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

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

 >>> impor^[[D 

我该如何解决这个问题?

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

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

感谢@chown这里是关于这个的文档: http ://docs.python.org/2/tutorial/interactive.html

我已经通过安装readline包解决了这个问题:

 pip install readline 

在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 

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

当我使用系统python shell时,键是没有问题的,但在virtualenv问题。 我会尝试重新安装/升级virtualenv / readline,没有任何修复。

虽然我尝试import readline问题pythonshellimport 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 ,所以我做了一个符号链接:

 ln libreadline.7.dylib libreadline.6.dylib 

问题已经解决了!

  1. 安装readline-devel软件包。
  2. 用readline模块重新编译python
  3. 答对了!

下面是在Ubuntu 12.04中为python 3.3工作的步骤。

1)打开teminal并写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 

在CentOS上,我解决了这个问题

yum install readline-devel

然后重新编译python 3.4。

在OpenSUSE上,我解决了这个问题

 pip3 install readline 

在Valerio Crini的回答之后。

也许“pip3安装readline”是一个通用的解决scheme。 还没有尝试过我的CentOS。

我通过执行以下操作来解决此问题:

  • yum安装readline-devel
  • pip安装readline

    • 我在这里遇到另一个错误:

      gcc: readline/libreadline.a: No such file or directory

      gcc: readline/libhistory.a: No such file or directory

      我通过安装patch修复了这个问题

      yum install patch

之后,我成功地运行了pip install readline ,它解决了我的python shell中的转义字符。

仅供参考,我正在使用RedHat

将Mac升级到高级Sierra之后受到影响,为我成功解决了这个问题:

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

如果你使用Anaconda Python,你可以运行以下命令来解决这个问题:

 conda install readline 

为我工作!

你有没有尝试过使用不同的SSH客户端? 一些SSH客户端为不同的远程进程有特殊的内置的keymappings。 我用emacs碰到了这个。

你在用什么客户? 我build议尝试Putty和SecureCRT来比较他们的行为。

你是否用-t参数调用ssh来告诉ssh为你分配一个虚拟terminal?

从手册页:

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

此外,您可能还必须正确设置服务器上的TERM环境variables,如另一篇文章中的build议。

在OS X上,使用python 3.5和virtualenv

 $ pip install gnureadline 

在翻译的时候呢:

 import gnureadline 

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


附加信息…

请注意,截至2015年10月1日,readline已被DEPRECATED (源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 

你的envvariables$ TERM是如何设置的[a]当事情正常时,[b]当他们不? 环境设置往往是这些问题的关键。

尝试获取运行在服务器上的关键代码库。 如果这不起作用,请尝试下载具有读键function的库。

我正在尝试在Ubuntu 14.0上构buildPython 2.7。 你将需要libreadline-dev。 但是,如果你从apt-get得到它,当前的版本是6.3,这是不符合Python 2.7(不知道关于Python 3)。 例如,以前版本的readline中定义的数据types“Function”和“CPPFunction”已在6.3中删除,如下所示:

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

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

最后这个问题已经解决了。

对于那些使用conda,从conda-forge渠道安装readline软件包将解决这个问题:

 conda install -c conda-forge readline=6.2