我试图扩展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
点击标签现在完成了"字符串"。
任何人都可以解释为什么会这样,如果有办法解决这个问题吗?
答案 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即可。