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

时间:2009-05-21 13:55:32

标签: python shell ssh arrow-keys

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

但是在我进入另一台机器并在那里开始python之后,我得到了以下会话:

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

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

>>> impor^[[D

我该如何解决这个问题?

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

25 个答案:

答案 0 :(得分:83)

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

pip install readline

答案 1 :(得分:56)

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

当我使用系统python shell时,键没有问题,但在virtualenv中有问题。我尝试重新安装/升级virtualenv / readline并且没有修复。

当我在问题python shell中尝试import 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 -s libreadline.7.dylib libreadline.6.dylib

问题已经解决了!

答案 2 :(得分:45)

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

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

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

pip3 uninstall readline
easy_install readline

答案 3 :(得分:30)

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

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

答案 4 :(得分:19)

在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

答案 5 :(得分:15)

  1. 安装readline-devel包。
  2. 使用readline模块重新编译python
  3. 宾果!

答案 6 :(得分:10)

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

答案 7 :(得分:8)

我在Ubuntu 16.04 LTS上遇到Python 3.6.x的shell历史记录(tab / arrows命令)。

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

为我解决的是安装模块&#34; gnureadline&#34;如user12345所述,使用以下命令行:

sudo pip3.6 install gnureadline

:)

答案 8 :(得分:7)

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

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

答案 9 :(得分:5)

我最近遇到了这个问题,在阅读了很多有关pip install readline(不适用于mac osx)和pip install gnureadline并且不满意之后,现在这是我的设置,启用了箭头键在任何python控制台中:

  1. 使用pip install gnureadline
  2. 安装gnureadline

现在您可以执行import gnureadline并且箭头键应该可以正常工作。要使它们自动工作,请执行以下步骤:

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

不起作用,但在我先前的设置中起作用的一件事是:在pdb.set_trace()上自动导入gnureadline。如果有人能很好地解决这个问题,我将不胜感激。

答案 10 :(得分:5)

在CentOS上,我通过

解决了这个问题

yum install readline-devel

然后重新编译python 3.4。

在OpenSUSE上,我通过

解决了这个问题
pip3 install readline

遵循Valerio Crini的回答。

也许&#34; pip3安装readline&#34;是一般解决方案。 Haven没试过我的CentOS。

答案 11 :(得分:3)

我通过执行以下操作来修复此问题:

  • yum install readline-devel
  • pip install 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

答案 12 :(得分:3)

如果您使用Anaconda Python,可以通过运行:

来解决此问题
conda install readline

为我工作!

答案 13 :(得分:2)

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

从手册页:

  

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

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

答案 14 :(得分:2)

在Mac OS X Mojave 10.14.6上,通过brew进行了各种历史安装,我使用以下方法解决了此问题:

brew reinstall python2

考虑到每个人的安装方案不同,可能没有万灵丹。我也尝试了上述方法,因此可能是一些答案的组合。 Brew默认为python3,因此,如果您安装了python2软件包,则也需要重新安装它。

答案 15 :(得分:1)

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

conda install -c conda-forge readline=6.2

答案 16 :(得分:1)

您是否尝试过使用其他SSH客户端?某些SSH客户端具有针对不同远程进程的特殊内置键映射。我和emacs一起经常遇到这个。

您使用的是哪个客户?我建议尝试使用Putty和SecureCRT来比较他们的行为。

答案 17 :(得分:0)

在 Unbuntu 或 Mint 中, 如果您使用 pyenv

sudo apt install libreadline-dev
pyenv uninstall 3.8.8
pyenv install 3.8.8

一旦安装了 libreadline-dev,你就不需要在每个 python 版本上安装 pip install gnureadline。

答案 18 :(得分:0)

在MacOsx上,我通过重新安装readline修复了此问题

brew reinstall readline

答案 19 :(得分:0)

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

rlwrap python mycode.py

答案 20 :(得分:0)

在OS X上,这对我有用:

xcode-select --install  # install xcode command line tools (if you haven't already)
brew reinstall python3  # reinstall python3 (perhaps not necessary)
pip3 install gnureadline  # pip install the gnureadline package

答案 21 :(得分:0)

readline模块已被弃用,在python shell中执行quit()或exit()时,它将在最新的python版本中导致无效的指针错误。 改为pip install gnureadline

答案 22 :(得分:0)

我在Ubuntu 14.0上尝试构建Python 2.7。你需要libreadline-dev。但是,如果从apt-get获得它,当前版本是6.3,这与Python 2.7不兼容(不确定Python 3)。例如,数据类型&#34;功能&#34;在6.3中删除了先前版本的readline中定义的&#34; CPPFunction&#34;,如下所示:

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

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

最后问题已经解决。

答案 23 :(得分:0)

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

答案 24 :(得分:0)

你的env变量$ TERM如何设置[a]当事情正常时,[b]当它们没有时?环境设置通常是解决此类问题的关键。