民间, 这似乎是一个基本的程序,我无法理解这里出了什么问题。当运行程序只是等待并且不在控制台上输出任何内容时,按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()
答案 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()
就个人而言,我坚持使用明确的延期用法。一旦你绕过它,它就会更容易理解,并且与其他扭曲的部分更加干净地集成。