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

Fra*_*ank 175 python ssh shell arrow-keys

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

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

>>> import os 
>>> ^[[A    
Run Code Online (Sandbox Code Playgroud)

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

>>> impor^[[D
Run Code Online (Sandbox Code Playgroud)

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

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

Val*_*ini 94

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

pip install readline
Run Code Online (Sandbox Code Playgroud)

  • 我必须在我的Ubuntu机器上安装`libncurses-dev`,然后正确安装readline. (23认同)
  • 我不得不安装`gnureadline`,请参见/sf/ask/3010914231/ (7认同)
  • 在CentOS上安装`ncurses-devel`然后`readline`安装没问题.Interactive shell现在正在运行. (4认同)
  • 不能在我的OS X机器上"pip install readline",每次成功执行`brew install readline`后都会失败 (4认同)
  • yum 安装 ncurses-devel (2认同)
  • @ user5359531我也不得不做`brew link readline` (2认同)
  • @TheGuywithTheHat:同样的问题在这里。我尝试在运行 `sudo pip3 install readline` 的 Raspberry Pi 上安装 `readline`,但是当我打开 Python 命令提示符并输入命令时,Python 崩溃了。我不得不卸载 `readline` 并安装 `gnureadline`。现在它完美地工作...... +1 为您的建议! (2认同)

rap*_*.zh 75

在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
Run Code Online (Sandbox Code Playgroud)

因为有/usr/local/opt/readline/lib/libreadline.7.dylib但不是libreadline.6.dylib,所以我做了一个符号链接:

ln -s libreadline.7.dylib libreadline.6.dylib
Run Code Online (Sandbox Code Playgroud)

问题已经解决了!

  • 非常感谢你!这救了我的命!:d (7认同)
  • 我没有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正常工作。 (3认同)
  • 我遇到了同样的问题,但是我没有做这些说明,而是"brew update && brew upgrade".这是否打破了PHP的过程仍有待观察. (2认同)

Max*_*ysh 47

在OS X上,Xcode更新有时会中断readline.解:

brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline
Run Code Online (Sandbox Code Playgroud)

如果问题仍然存在,请尝试删除readline使用pip并使用easy_install以下命令安装:

pip3 uninstall readline
easy_install readline
Run Code Online (Sandbox Code Playgroud)

  • @ user5359531我用`easy_install`选项更新了答案 (3认同)

ism*_*ail 36

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

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

  • 在带有brew的OSX上,我要做的只是“重新安装python3”。 (4认同)

use*_*345 26

在OS X上,使用python 3.5和virtualenv

$ pip install gnureadline
Run Code Online (Sandbox Code Playgroud)

在翻译中做:

import gnureadline
Run Code Online (Sandbox Code Playgroud)

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


附加信息...

请注意,截至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
Run Code Online (Sandbox Code Playgroud)

  • 好极了!这是目前唯一可行的方法。 (2认同)

Eri*_*ang 15

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

  • 我们如何重新编译Python?我是否需要从源代码安装extract python(./configure,make,make install),设置virtualenv并再次安装我的所有软件包? (3认同)
  • 感谢您提高我的生活质量!{;-)在Centos 5.5上,这是yum install readline-devel,你不必在重新编译中显式指定readline (2认同)

Dav*_*han 14

我最近遇到了这个问题,在阅读了很多有关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()。如果有人对这个问题有一个好的解决方案,我将不胜感激。


小智 11

以下是在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
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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

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

sudo pip3.6 install gnureadline
Run Code Online (Sandbox Code Playgroud)

:)

  • 无需使用 sudo (3认同)
  • 确保在 shell 中调用 `import gnureadline` 使其工作 (2认同)

小智 7

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

brew unlink python
xcode-select --install
brew install python
Run Code Online (Sandbox Code Playgroud)


小智 6

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


pet*_* gz 5

在CentOS上,我通过

yum install readline-devel

然后重新编译python 3.4。

在OpenSUSE上,我通过

pip3 install readline
Run Code Online (Sandbox Code Playgroud)

按照Valerio Crini的回答。

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


Ada*_*art 5

如果您使用 Anaconda Python,则可以通过运行以下命令来修复此问题:

conda install readline
Run Code Online (Sandbox Code Playgroud)

为我工作!

  • 就我而言,已经安装了“readline”,我必须执行“conda install ncurses”才能使其工作。 (3认同)