【发布时间】: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。