Я сделал очень простую интерактивную консоль, которую хотел бы использовать в сложном приложении для очистки. Это выглядит так:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, codecs, code
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__)
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__)
if 'DEBUG' in os.environ:
import pdb
import sys
oeh = sys.excepthook
def debug_exceptions(type, value, traceback):
pdb.post_mortem(traceback)
oeh(type, value, traceback)
sys.excepthook = debug_exceptions
class CLI(code.InteractiveConsole):
def __init__(self, locals=None, filename="<console>", histfile=None):
code.InteractiveConsole.__init__(self, locals, filename)
try:
import readline
except ImportError:
pass
else:
try:
import rlcompleter
readline.set_completer(rlcompleter.Completer(locals).complete)
except ImportError:
pass
readline.parse_and_bind("tab: complete")
self.interact()
if __name__ == "__main__":
hello="I am a local"
CLI(locals=locals())
Если я вызываю его из другого простого приложения, он работает нормально:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, codecs, cli
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__)
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__)
from cli import CLI
foo="i am a local"
CLI(locals=locals())
Однако, когда я вызываю его из моего фреймворка для очистки, который пока основан на сарже и механизации (хотя я намерен переключить это в gevent) при вызове интерфейса командной строки точно так же, клавиши со стрелками не работают, завершение табуляции не работает, фактически оно ведет себя так, как будто строки чтения не существует. Я пробовал перезагрузить модуль readline и передать ему прямые команды parse_and_bind, но по какой-то причине он просто не будет работать должным образом. Любые намеки или предложения относительно того, что было заблокировано, что мешает ему работать должным образом, или мне просто придется удалить все используемые внешние модули и вставить их, один за другим, чтобы увидеть, что произошло?
Я с подозрением отношусь к twill, поскольку у него есть собственный базовый интерфейс командной строки, но если кто-нибудь знает, я был бы очень рад узнать, есть ли у кого-нибудь хорошее представление о том, что происходит.
О, и, пожалуйста, не комментируйте, что я делаю с stderr и stdout, это просто шаблонный код, который помещается в файлы python, я всегда запускаю их с консолей utf8, и я не об этом спрашиваю ...