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


191

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

但是,当我将SSH切换到另一台机器并从python那里启动时,我得到如下会话:

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

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

>>> impor^[[D

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

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


我认为这属于服务器故障。这是由错误的终端类型引起的。
epochwolf,2009年

我在下面同意Cartman的观点,这是一个readline问题,而不是终端类型问题。
弗兰克,

2
easy_install readline,然后easy_install ipython在Mac中运行完美。
gnuyoga

安装anaconda2或anaconda3并设置.pystartup,请参见链接
Leon WANG

1
@LeonWANG给出了一个错误的答案-不要安装像anaconda这样大的东西,只是为了使您的.pystartup文件正常工作。完全没有必要。
jdogg '18 -10-16

Answers:


38

似乎未启用readline。检查PYTHONSTARTUP变量是否已定义,对我而言,它指向/etc/pythonstart该文件,并且文件在交互之前由python进程执行,从而设置了读取行/历史记录处理。

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


谢谢,我同意读书热线似乎是问题所在。该系统确实具有/usr/lib/libreadline.so.5。没有/ etc / pythonstart。
弗兰克

1
经过一番谷歌搜索后,似乎在安装readline-devel之后,可能必须重新编译该系统上的python。
弗兰克,

1
环境变量PYTHONSTARTUP不是PYTHONSTART。不确定特定于发行版的/etc/pythonstart文件。
内德·迪利

1
实际上,阅读docs.python.org/2/tutorial/interactive.html提供了pystartup文件所需的所有信息。
chown

7
在带有brew的OSX上,我所要做的就是brew reinstall python3
Ranhiru Jude Cooray

102

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

pip install readline

24
我必须libncurses-dev在我的Ubuntu计算机上安装,然后正确安装readline。
阿米尔·埃尔多

4
安装ncurses-devel在CentOS上,然后readline安装没问题。交互式外壳现在正在工作。
one.time 2016年

1
yum install ncurses-devel
Alex Punnen

4
不能pip install readline在我的OS X计算机上运行,​​即使成功完成后每次都会失败brew install readline
user5359531 2016年

9
我必须安装gnureadline,请参阅stackoverflow.com/q/43013060/2846923
帽子的家伙

82

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

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

当我尝试使用import readline有问题的python shell时,收到以下错误消息:

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

问题已解决!


看了又看,我能够用这个建议解决这个问题。谢谢!
gl051

如果某些人调用v6而不意识到它实际上是v7,这不会引起问题吗?
亚当·巴恩斯

3
我遇到了同样的问题,但我没有这样做brew update && brew upgrade。这个过程是否破坏了PHP,还有待观察。
亚当·巴恩斯

@AdamBarnes这也帮了我大忙。我也使用pyenv,因此请确保在升级所有自制程序包后卸载/重新安装所需的python版本。
funseiki

3
我没有libreadline.7.dylib(也许是因为我使用的是Mojave 10.14.x,然后更新了XCode 10.2.1),但是却使用了ver 8。执行ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib解决了扫描代码的问题,但没有恢复历史记录命令的调用。尽管在这种情况下,半修复总比没有好。(是的,我还添加了一个6链接,没有区别)。附录:对我来说,这只是/仅是python2的问题。没有链接,python3正常工作。
Zim

51

在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

如果使用的是系统Python 2.7.10,有什么等效的选择?
user5359531 2016年

3
@ user5359531我用一个easy_install选项更新了答案
Max Malysh 2016年


1
使用easy_install对我有效,而使用pip的无效。
Justhalf

1
结合brew link readline(即使已经被链接)为我修复了它。
理查德·拉斯特

28

在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

这行得通,但是这意味着我需要import gnureadline在每个交互式会话的顶部添加一个非常烦人的内容。有没有一种方法可以在每个交互式会话开始时启动?
安东密码

1
@Panchishin尝试使用PYTHONSTARTUP环境变量来命名一个文件,该文件已在显示交互式提示(即import gnureadline)之前执行了Python命令。有关其他可能的想法,请参见:运行python命令行解释器并自动加载导入文件
user12345 '19

19

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

  1. 使用安装gnureadline pip install gnureadline

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

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

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


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

2
感谢您改善我的生活质量!{;-)在Centos 5.5上,您可以安装readline-devel,而不必在重新编译时明确指定readline
michela 2010年

3
我们如何重新编译Python?我是否需要从源代码中安装解压缩python(./ configure,make,make install),设置virtualenv并再次安装所有软件包?
穆罕默德·瓦卡

14

我在Ubuntu 16.04 LTS上遇到Python 3.6.x的外壳历史记录(选项卡/箭头命令)问题。

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

对我来说解决的是使用以下命令行安装user12345所说的模块“ gnureadline”:

sudo pip3.6 install gnureadline

:)


1
我尝试了所有其他解决方案,但是该解决方案对我的Python 3.6
很有用

1
确保调用import gnureadline外壳程序使其正常工作
David Schumann

3
无需使用sudo
Newalp


7

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

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

5

在CentOS上,我通过

yum install readline-devel

然后重新编译python 3.4。

在OpenSUSE上,我通过

pip3 install readline

按照Valerio Crini的回答。

也许“ pip3 install readline”是一个通用解决方案。尚未在我的CentOS上尝试过。


推荐使用readline-devel技巧。它在Centos6.5机器上朗读python 2.7.8上为我工作。我直接调用pip install readline而不重新编译python,它工作正常。
Arjun 2015年

3

我通过以下操作解决了这个问题:

  • 百胜安装readline-devel
  • 点安装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


CentOS 6.8,Python2.7.12,成功
kkzxak47 '16

3

如果使用Anaconda Python,则可以通过运行以下命令解决此问题:

conda install readline

为我工作!


2
就我而言,readline已经安装了,我必须做conda install ncurses使其工作。
whenov


2

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

从手册页:

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

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


2

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

brew reinstall python2

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


2

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

rlwrap python mycode.py


1

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

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


嗯,我只在终端中使用ssh命令(ssh -v表示OpenSSH_3.9p1,OpenSSL 0.9.7a,2003年2月19日)。
弗兰克

试用Putty(免费),然后
再找

好的,我刚刚安装了腻子,并用它连接到计算机上,但是那里的行为是相同的。
弗兰克

:(那肯定是服务器端的问题。我将研究它,并再
回信给

使用ssh命令连接到其他计算机可以正常工作:那里,箭头键没有问题。这似乎是一个有问题的特定系统。
弗兰克(Frank)

1

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


0

当一切正常时,您的环境变量$ TERM如何设置?环境设置通常是解决此类问题的关键。


1
我只是尝试了一些TERM变量值:vt102,vt220,ansi,xterm,但是它们都没有改变行为。
弗兰克(Frank)

0

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


0

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

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

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

终于问题解决了。


0

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

brew reinstall readline
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.