2011-03-01 3 views
1

Folks, Cela semble être un programme de base et je ne peux pas comprendre ce qui ne va pas ici. Lorsqu'il est exécuté, le programme attend juste et ne sort rien sur la console, en appuyant sur control-c ne produit rien non plus. S'il vous plaît donnez votre avis.Python tordu différé et getProcessOutputAndValue question

Ma compréhension est la suivante: (i) Reactor est exécuté et callLater provoque l'appel de runProgram après '0' secondes. (ii) runProgram obtient un retour différé de getProcessOutputAndValue, et j'ajoute Callback et Errback ainsi que reactor.stop() comme callback 'Both'.

Mon attente est maintenant, le rappel de différé (ou Errback en cas d'échec) doit être appelé lorsque l'exécution de la commande est terminée. Enfin, puisque addBoth est spécifié, il faut appeler le reactor.stop() qui arrête le réacteur.

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

Répondre

1

Comme cela a déjà été indiqué, le rendement est inutile. Pour utiliser le rendement que vous souhaitez réécrire runprogram comme:

from twisted.internet import defer 

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

Personnellement je bâton avec l'utilisation différée explicite. Une fois que vous enveloppez votre tête, il est plus facile à comprendre et intègre plus proprement avec le reste de la torsion.

+0

Merci. Choisir votre réponse comme vous avez donné le supplément sur la façon de l'utiliser avec le rendement. – helpmelearn

2

Vous n'avez pas besoin yield - la valeur de retour de getProcessOutputAndValue est déjà un Deferred.

+0

Merci. Je vais choisir l'autre réponse seulement parce qu'elle a l'usage avec le rendement. – helpmelearn

+0

Bien sûr, pas de soucis. :) – Amber