214

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

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

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

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

>>> impor^[[D

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

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

4

25 回答 25

118

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

pip install readline
于 2014-10-14T08:46:59.450 回答
83

在 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

问题已解决!

于 2017-01-10T02:50:07.567 回答
51

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

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

如果问题仍然存在,请尝试删除readlineusingpip并使用以下方式安装easy_install

pip3 uninstall readline
easy_install readline
于 2016-10-25T01:20:17.777 回答
39

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

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

于 2009-05-21T14:27:22.183 回答
32

在 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
于 2017-05-26T21:04:13.247 回答
23

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

  1. 使用安装 gnureadlinepip install gnureadline

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

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

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

于 2019-03-11T13:30:58.863 回答
18

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

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

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

sudo pip3.6 install gnureadline

:)

于 2018-05-21T18:24:32.693 回答
15
  1. 安装 readline-devel 包。
  2. 使用 readline 模块重新编译 python
  3. 答对了!
于 2010-05-10T20:04:31.253 回答
11

以下是在 ubuntu 12.04 for python 3.3 中对我有用的步骤。

1)打开终端并写入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
于 2013-06-30T19:44:05.433 回答
7

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

brew unlink python
xcode-select --install
brew install python
于 2017-10-10T00:13:19.763 回答
5

在 CentOS 上,我通过

yum install readline-devel

然后重新编译python 3.4。

在 OpenSUSE 上,我通过

pip3 install readline

遵循 Valerio Crini 的回答。

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

于 2015-01-24T22:32:03.773 回答
5

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

conda install readline

为我工作!

于 2017-02-10T21:32:46.083 回答
4

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

rlwrap python mycode.py

于 2019-10-16T15:31:45.023 回答
3

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

  • 百胜安装 readline-devel
  • 点安装阅读线

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

      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

于 2016-01-15T03:24:25.493 回答
3

对于那些使用 conda 的人,从 conda-forge 频道安装 readline 包将解决问题:

conda install -c conda-forge readline=6.2
于 2017-09-20T08:19:21.607 回答
2

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

从手册页:

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

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

于 2009-05-21T14:22:24.440 回答
2

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

于 2018-11-28T02:56:56.410 回答
2

在具有各种历史安装的 Mac OS X Mojave 10.14.6 上,brew我通过以下方式解决了这个问题:

brew reinstall python2

鉴于每个人都有不同的安装场景,可能没有灵丹妙药。我也尝试了上述方法,所以它可能是几个答案的组合。Brew 默认是python3这样,如果你安装了这个python2包,它也需要重新安装。

于 2019-08-11T01:53:45.943 回答
1

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

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

于 2009-05-21T13:57:57.283 回答
0

当一切正常时,您的环境变量 $TERM 如何设置 [a],而当它们不正常时,您的环境变量如何设置 [b]?环境设置通常是此类问题的关键。

于 2009-05-21T14:03:52.153 回答
0

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

于 2013-06-25T20:49:56.227 回答
0

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

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

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

终于问题解决了。

于 2015-05-13T16:14:22.530 回答
0

在 MacOsx 上,我通过重新安装 readline 解决了这个问题

brew reinstall readline
于 2019-09-27T18:59:27.883 回答
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。

于 2021-03-22T03:55:14.313 回答
0

您可以通过以下方式从“sh”切换到“bash”

$ /sh/bash
于 2022-02-09T05:26:05.807 回答