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

问题描述 投票:154回答:20

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

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

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

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

>>> impor^[[D

我怎样才能解决这个问题?

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

python shell ssh arrow-keys
20个回答
32
投票

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

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


7
投票

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

pdb.set_trace()

5
投票

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

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

然后重新编译python 3.4。

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

yum install readline-devel

关注Valerio Crini的回答。

也许“pip3安装readline”是一个通用的解决方案。没试过我的CentOS。


3
投票

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

  • yum install readline-devel
  • pip安装readline 我在这里遇到另一个错误: pip3 install readline gcc: readline/libreadline.a: No such file or directory 我通过安装gcc: readline/libhistory.a: No such file or directory解决了这个问题: patch

之后我成功运行了yum install patch,解决了我的python shell中的转义字符。

仅供参考,我正在使用RedHat


3
投票

如果您使用Anaconda Python,您可以通过运行以下方法解决此问题:

pip install readline

为我工作!


2
投票

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

从手册页:

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

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


1
投票

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

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


1
投票

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

conda install readline

1
投票

在Mac OS X Mojave 10.14.6上通过conda install -c conda-forge readline=6.2 进行各种历史安装我解决了这个问题:

brew

鉴于每个人都有不同的安装方案,可能没有灵丹妙药。我也尝试了上面的内容,所以它可能是一些答案的组合。 Brew默认为brew reinstall python2 ,因此如果您安装了python3包,则还需要重新安装。


0
投票

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


0
投票

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


90
投票

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

pip install readline

0
投票

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

python2

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

最后问题已经解决。


0
投票

不推荐使用readline模块,这会在python shell中执行quit()或exit()时在最新的python版本中导致无效的指针错误。 https://github.com/yyuu/pyenv/issues/126代替


0
投票

在OS X上,这对我有用:

pip install gnureadline

67
投票

在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

问题已经解决了!


46
投票

在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

22
投票

在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

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

10
投票

以下是在ubuntu 12.04 for python 3.3中为我工作的步骤。

1)打开终端并写下qazxsw poi

2)从sudo apt-get install libreadline-dev下载python 3.3.2的源文件

3)解压缩并导航到shell中的Python-3.3.2 /目录

4)执行以下命令:

http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz

9
投票

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

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

为我解决的是使用此命令行安装user12345所述的模块“gnureadline”:

./configure
make
make test
sudo make install

:)


9
投票

我最近遇到过这个问题,在阅读了很多关于sudo pip3.6 install gnureadline (对mac osx不起作用)和pip install readline并且不满意之后,现在我的设置允许在任何python控制台中使用箭头键:

  1. 使用pip install gnureadline安装gnureadline

现在你可以做pip install gnureadline和箭头键应该按预期工作。要使它们自动运行,请按照以下步骤操作:

  1. 创建(或附加)文件import gnureadline~/.startup.py
  2. 追加文件import gnureadline~/.bash_profile

有一点不起作用,但在我之前的设置中做的是:在export PYTHONSTARTUP=~/.startup.py上自动导入gnureadline。如果有人对这个问题有一个很好的解决方案,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.