IPython 在 Mac Terminal 下自动缩进问题如何解决?

macOS 下使用 Terminal,发现 IPython 的自动缩进有个比较奇怪的问题,求教一下大家:
if/for/def 等语句,冒号之后,IPython 会自动换行,缩进一格
如果再按一次 Enter,这两行代码就自动执行了
如果想多写几行代码,应该怎么办呢?

例如我的代码是这样子,输入完毕 print(‘hello’)之后代码块就执行了,没有办法增加一行新的了
In [10]: def say():
…: print(‘ hello ’)
IPython 在 Mac Terminal 下自动缩进问题如何解决?

10 回复

发现了按 Ctrl-O 时,会再增加一行新的行
不过这样又有了新问题,就是后面不会再自动缩进了[捂脸]


在Mac的Terminal里用IPython,自动缩进出问题,多半是readline库的锅。macOS自带的libedit(一个readline的替代品)和Python的readline模块兼容性不好,导致退格、方向键和自动缩进这些功能不正常。

核心解决方法就是给Python装上真正的GNU readline库。

最直接有效的方法是通过pip安装gnureadline

pip install gnureadline

安装后,IPython会自动优先使用gnureadline,问题通常就能解决。如果不行,可以试试在启动IPython前设置环境变量:

export PYTHONSTARTUP=$HOME/.pythonstartup

然后创建~/.pythonstartup文件,里面写上:

import sys
try:
    import gnureadline as readline
except ImportError:
    import readline
sys.modules['readline'] = readline

这样能强制Python使用gnureadline模块。

如果还不行,或者你用的是系统自带的Python,可以试试用Homebrew安装新版readline,然后重装Python的readline模块:

brew install readline
pip uninstall -y readline gnureadline
pip install gnureadline --no-cache-dir

总结:装gnureadline基本能搞定。

还有一个小问题,是关于 tab 自动补全的,为啥高亮的方法下方都标示了一个<unknown>
例如
a = ‘’
a.<tab>
弹出的 a.capitalize,a.casefold 这些方法下方都是<unknown>

我之前也发现这个问题了, 记得以前是不会直接执行的, 不知道什么时候变得不一样了. 懒得没仔细研究就切去用 jupyter notebook 了.

多谢,暂时就先这么用用了

问题 post 到了 stack overflow 上,目前没人回复。。。

推荐一下[ptpython]( https://github.com/jonathanslenders/ptpython),相当于一个 TUI 的 ipython 前端(运行的时候运行 ptipython,ptpython 是 wrap 了 python 的原生 REPL )

多谢多谢~我学习一下!

https://github.com/ipython/ipython/issues/11334 看样子是个 Bug, 但已经修掉了 ( https://github.com/ipython/ipython/pull/11358). 等 7.1 版本就好了. 或者你可以先装回 6.x 将就着用.

喔唷 棒棒棒!那我等等!

回到顶部