有没有办法在python中结合readline / rlcompleter和InteractiveConsole?

时间:2016-01-31 14:55:57

标签: python gnu readline

我试图扩展python shell(遗憾的是我无法使用IPython)。我希望关键字能够完成并解释一些自定义输入(这不是有效的python)。但我不能让readline / rlcompleter和InteractiveConsole一起工作。为了证明这个问题:

$ python -c "import code; code.InteractiveConsole().interact()"
Python 2.7.10 (default, Jun  1 2015, 18:05:38)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import readline
>>> import rlcompleter
>>> readline.parse_and_bind("tab: complete")
>>> import string
>>> stri

点击此处没有任何选项。

$ python
Python 2.7.10 (default, Jun  1 2015, 18:05:38)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import readline
>>> import rlcompleter
>>> readline.parse_and_bind("tab: complete")
>>> import string
>>> stri

点击标签现在完成了"字符串"。

任何人都可以解释为什么会这样,如果有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

好的 - 在python源码中挖掘一些可以看出答案。问题是在InteractiveConsole中,命名空间设置为__main__之外的其他内容。但rlcompleter从builtins__main__完成。上面Import string导入到当前名称空间,该名称空间不是__main__,并且不被rlcompleter搜索。

因此,一个解决方案是构建自己的rlcompleter.Completer并将locals()传递给ctor:

$ python -c "import code; code.InteractiveConsole().interact()"
Python 2.7.10 (default, Jun  1 2015, 18:05:38) [GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import readline
>>> from rlcompleter import Completer
>>> readline.parse_and_bind("tab: complete")
>>> readline.set_completer(Completer(locals()).complete)
>>> import string
>>> str
str(    string

答案 1 :(得分:0)

此职位已有4年历史,因此我要建议的解决方案当时可能尚不可用。但是至少从Python 3.7.7开始,以下代码可让您使用Python开头的所有读取行设置并自动添加制表符完成:

import code, readline, rlcompleter
readline.parse_and_bind('tab: complete')
InteractiveConsole(locals()).interact()

之所以有效,是因为只需导入readline即可。