Python Twisted Defer и getProcessOutputAndValue вопрос - PullRequest
1 голос
/ 01 марта 2011

Народ, это похоже на базовую программу и я не могу понять, что здесь происходит не так.При запуске программа просто ждет и ничего не выводит на консоль, нажатие control-c также ничего не выводит.Пожалуйста, сообщите.

Насколько я понимаю, следующее: (i) Реактор запускается, и callLater заставляет runProgram вызываться через '0' секунд.(ii) runProgram получает отсроченный возврат из getProcessOutputAndValue, и я добавляю Callback и Errback, а также processor.stop () в качестве обратных вызовов «Оба».

Теперь я ожидаю, что обратный вызов отложенного вызова (или ошибка при сбое)) должен быть вызван после выполнения команды.Наконец, так как указан addBoth, должен быть вызван реактор.stop (), который останавливает реактор.

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 ]

2 голосов
/ 01 марта 2011

Вам не нужно yield - возвращаемое значение из getProcessOutputAndValue уже равно Deferred.

1 голос
/ 01 марта 2011

Как уже было сказано, урожай там не нужен.Чтобы использовать 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()

Лично я бы придерживался явного отложенного использования.Как только вы обернетесь вокруг головы, ее будет легче понять, и она будет более четко интегрирована с остальной частью скрученного.

...