【问题标题】:Why does my python interactive console not work properly?为什么我的 python 交互式控制台不能正常工作?
【发布时间】:2010-10-27 08:13:03
【问题描述】:

我制作了一个非常简单的交互式控制台,我想在复杂的抓取应用程序中使用它。它看起来像这样:

#!/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),当以完全相同的方式调用 CLI 时,箭头键不起作用,制表符完成不起作用,实际上它的行为就像 readline 不存在一样。我尝试重新加载 readline 模块并将其直接传递给 parse_and_bind 命令,但由于某种原因,它无法正常播放。关于已破坏的任何提示或建议阻止它按预期工作,还是我只需要删除所有正在使用的外部模块并将它们一一放入以查看发生了什么?

我怀疑 twill 看到它,因为它有自己的基本 CLI,但如果有人知道,我很乐意知道是否有人知道发生了什么。

哦,请不要让 cmets 关于我正在使用 stderr 和 stdout 做什么,它只是放入 python 文件中的样板代码,我总是从 utf8 控制台运行它们,这不是我要问的...

【问题讨论】:

  • 我只是尝试在导入任何其他内容或修改 stderr 和 stdout 然后运行 ​​.interact() 之前尝试创建 CLI 对象,它仍然表现得像没有 readline。

标签: python readline


【解决方案1】:

好的,我发现是我造成了问题,在我注意到它在某些情况下导致问题之前,我的旧样板代码已经习惯了:

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__)

或者完全删除它,因为它不需要在那个文件中解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 2012-04-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多