2016-01-31 3 views
0

Я пытаюсь расширить оболочку python (я не могу использовать IPython, к сожалению). Мне хотелось бы, чтобы оба ключевых слова заполнили и интерпретировали некоторые пользовательские вводные данные (это не будет действительным python). Но я не могу заставить readline/rlcompleter и InteractiveConsole работать вместе. Для демонстрации проблемы:Есть ли способ объединить readline/rlcompleter и InteractiveConsole в python?

$ 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 

Вкладка «Ввод» теперь завершается до «string».

Может ли кто-нибудь объяснить, почему это так, и есть ли способ обойти это?

ответ

0

ОК - некоторые копания в источнике python показывают ответ. Проблема заключается в том, что в InteractiveConsole для пространства имен установлено значение, отличное от __main__. Но rlcompleter заканчивается от builtins и __main__. Import string выше импорта в текущее пространство имен, которое не является __main__ и не выполняется поиском rlcompleter.

Таким образом, решение построить свой собственный rlcompleter.Completer и передать местным жителям() в 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 

 Смежные вопросы

  • Нет связанных вопросов^_^