Почему моя интерактивная консоль Python не работает должным образом?

Я сделал очень простую интерактивную консоль, которую хотел бы использовать в сложном приложении для очистки. Это выглядит так:

#!/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, и я не об этом спрашиваю ...

7
задан user376403 27 October 2010 в 08:28
поделиться