Python twisted defer和getProcessOutputAndValue问题

时间:2011-03-01 03:35:50

标签: python twisted

民间, 这似乎是一个基本的程序,我无法理解这里出了什么问题。当运行程序只是等待并且不在控制台上输出任何内容时,按control-c也不输出任何内容。请指教。

我的理解如下: (i)运行Reactor并且callLater导致在'0'秒后调用runProgram。 (ii)runProgram从getProcessOutputAndValue返回延迟,我将Callback和Errback以及reactor.stop()添加为'Both'回调。

我现在的期望是,在命令执行完成时必须调用延迟的Callback(或失败时的Errback)。最后,由于指定了addBoth,因此应该调用reactor.stop()来停止reactor。

from twisted.internet.utils import getProcessOutputAndValue
from twisted.internet import reactor

def printResult(result):
   print u'Result is %s' % result

def printError(reason):
   print u'Error is %s' % reason

def stopReactor(r):
   print u'Stopping reactor'
   reactor.stop()
   print u'Reactor stopped'

def runProgram():
   command = ['lrt']
   d = yield getProcessOutputAndValue('echo', command)
   d.addCallback(printResult)
   d.addErrback(printError)
   d.addBoth(stopReactor)

reactor.callLater(0, runProgram)
reactor.run()

2 个答案:

答案 0 :(得分:2)

您不需要yield - 来自getProcessOutputAndValue的返回值已经是Deferred

答案 1 :(得分:1)

如前所述,那里的产量是不必要的。要使用yield,你需要重写runProgram,如:

from twisted.internet import defer

@defer.inlineCallbacks
def runProgram():
    command = ['lrt']
    try:
        result = yield getProcessOutputAndValue('echo', command)
        printResult(result)
    except e:
        printError(e)
        stopReactor()

就个人而言,我坚持使用明确的延期用法。一旦你绕过它,它就会更容易理解,并且与其他扭曲的部分更加干净地集成。