Python交互模式历史记录和箭头键

28
我想知道为什么在Python交互模式中,所有箭头键突然失效?
例如,当我按上箭头浏览命令历史记录时,会出现"^[[A",其他箭头键也是如此。
我不知道为什么会出现这种情况,在Snow Leopard操作系统中之前都能正常工作。有人知道如何解决吗?
非常感谢,
G
5个回答

15
如果您正在使用Homebrew,那么这很容易解决:
brew uninstall python
brew uninstall readline
brew install readline  --universal
brew install python
这对我有用(运行OS X Mavericks 10.9.5)。

2
我刚刚在OSX 10.10.1上为Python3使readline工作了。我不得不将最后一行更改为brew install python --readline --framework,然后我必须执行以下操作:(1)将/usr/local/share/python添加到我的PATH中。(2)pip3.4 install readline。然后我输入了python3,readline又可以工作了。 - Ben Kovitz
这会用其他版本的Python 2.7替换系统Python 2.7.10吗? - user5359531
@user5359531 系统自带的 Python 不会被替换,但如果你已经使用 brew install python 安装了 Python,则可以按照以下步骤操作,brew 可能会用新版本替换 的版本。检查:which python(报告 brew 版本在 /usr/local/bin/python),brew unlink python && which python 报告系统版本,brew link python 以恢复 brew 版本。这是非破坏性的。 - ptim
我也试过了,我使用的是OS X 10.12。 - Jeune

13

我终于让它起作用了。我只需要使用easy_install安装readline和cursors,然后回退和删除键就神奇地开始工作了。

sudo /opt/local/bin/easy_install-2.5 readline

1
apt-get install libncurses5-dev && pip install readline 变体在我的 Ubuntu(基于 Trusty)上运行良好。 - vaab
1
大多数人需要写 sudo easy_install readline - Pylinux

8
你没有说明你使用的是哪一个Python版本,但你提到的症状通常是由于Python未使用readline支持而引起的。如今,在OS X上的Python可以构建为使用GNU readline库或Apple提供的editline库(又称libedit)。您可以使用以下两个命令来显示您正在使用哪个Python版本。如果这不能帮助您弄清楚发生了什么,请编辑您的问题以显示这些命令的输出。
以下是在OS X 10.6上最近的MacPorts Python 2.6的示例:
$ python -c 'import sys;print(sys.version);print(sys.executable)'
2.6.5 (r265:79063, Jul 15 2010, 01:53:46) 
[GCC 4.2.1 (Apple Inc. build 5659)]
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python

$ otool -L $(python -c 'import readline; print(readline.__file__)')
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/readline.so:
    /opt/local/lib/libreadline.6.1.dylib (compatibility version 6.0.0, current version 6.1.0)
    /opt/local/lib/libncursesw.5.dylib (compatibility version 5.0.0, current version 5.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

路径前缀/opt/local/是MacPorts安装软件的默认位置,从otool输出可以看出,此Python的readline模块是动态链接到MacPorts安装的GNU readline库。


查看 Python 的 readline 模块的提示很有帮助。显然,我的模块实际上并没有链接到 libreadline。我不知道为什么没有链接成功,因为 readline 已经安装好了。无论如何,port -f uninstall py27-readline; port install py27-readline 解决了这个问题。 - Celada

6
这种情况通常是由于缺少readline支持引起的。如果您使用的是MacPorts,请尝试port install readline,看看是否能解决问题。您还可以查看此页面获取更多解释。
(另外需要知道的是:即使系统中已经存在readline,有些程序也不会使用它。您可以通过使用rlwrapport install rlwrap)来强制启用它们。例如:rlwrap ocaml -init code.ml将启动OCaml,读取code.ml,并启动带有readline支持的REPL)

1
尝试安装readline,但没有帮助。无论如何还是谢谢。我会继续挖掘。 - givp
它对我也起作用了。为了让它与Python的pdb一起工作,安装rlwrap(port install rlwrap),然后使用命令rlwrap python启动Python。有关传递参数等信息,请参阅rlwrap的man页面。 - Dannid

0

这个命令:

brew install readline

对我来说有效。


这并没有真正回答问题。如果您有不同的问题,可以通过单击提问来询问。如果您想在此问题获得新答案时收到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏来吸引更多关注。- 来自审核 - Beso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接