为什么我的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())

但是,当我从我的基于斜体的scraping框架调用它并现在机械化(尽管我打算将它切换为gevent)时,以完全相同的方式调用CLI时,箭头键不起作用,制表符完成不起作用,实际上它的行为就像readline不存在一样。 我已经尝试重新加载readline模块并将其直接传递给parse_and_bind命令,但由于某些原因,它只是无法正常播放。 有什么暗示或建议可以阻止它按预期工作,或者我将不得不删除所有正在使用的外部模块,并将它们一个接一个地看到发生了什么?

我怀疑斜视,因为它有它自己的基本CLI,但如果有人知道我会很高兴知道是否有人有一个好主意发生了什么事。

哦,请不要评论我在使用stderr和stdout时所做的事情,它只是置入python文件中的样板代码,我总是从utf8控制台运行它们,而这不是我所问的...


好的,我发现这是我造成这个问题的原因,在我注意到它在某些情况下导致问题之前,我的旧锅炉板代码习惯了这种情况:

sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

旧的代码仍然存在于我自己的文件中,将该代码更改为以下版本的较低版本:

sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__)
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__)

或者完全删除它,因为无论如何它不需要在该文件中解决问题。

链接地址: http://www.djcxy.com/p/3443.html

上一篇: Why does my python interactive console not work properly?

下一篇: Can I use NHibernate on Windows Phone 7?