2016-01-31 58 views
0

我試圖擴展python shell(我不能使用IPython,可悲)。我想能夠完成關鍵字和解釋一些自定義輸入(這將不是有效的Python)。但是我無法使readline/rlcompleter和InteractiveConsole一起工作。爲了演示這個問題:有沒有什麼辦法可以在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

好的 - 有些在python源文件中進行挖掘可以發現答案。問題是在InteractiveConsole中,名稱空間被設置爲__main__以外的其他名稱。但rlcompleter從builtins__main__完成。上面的Import string導入到當前名稱空間中,該名稱空間不是__main__,並且不由rlcompleter搜索。

所以,一個解決方案是構建自己的rlcompleter.Completer和當地人)通(到構造函數:

$ 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 
相關問題