2016-06-24 10 views
0

Je considère pexpect (totalement ouvert aux alternatives, s'il y en a d'autres que je ne connais pas) dans l'un de nos wrappers de script de déploiement - mais j'ai besoin d'un moyen de lire la sortie en temps réel, pas seulement une fois que nous avons frappé le EOF. Comme il s'agit d'un package de déploiement, utilisé pour tous les environnements, nous devons détecter les problèmes dès qu'ils surviennent (et potentiellement atteindre la sortie de secours si c'est vraiment mauvais).Comment puis-je analyser pexpect en temps réel?

Y at-il une telle chose que je peux utiliser? Idéalement, je voudrais utiliser notre enregistreur déjà existant ..

def SetupLogging(): 
    # the logger 
    # set to DEBUG since the reports should already give 
    # any information we're looking for at a glance 
    global log 
    log = logging.getLogger('ansiwrap') 
    log.setLevel(logging.DEBUG) 

    # create file handler which logs everything 
    fh = logging.FileHandler('ansiwrap.debug', mode='w') 
    fh.setLevel(logging.DEBUG) 

    # create console handler with a higher log level 
    ch = logging.StreamHandler() 
    ch.setLevel(logging.INFO) 

    # create formatter and add it to the handlers 
    formatter = logging.Formatter('[%(asctime)s] | %(name)s - %(levelname)s - %(message)s') 
    ch.setFormatter(formatter) 
    fh.setFormatter(formatter) 

    # add the handlers to logger 
    log.addHandler(ch) 
    log.addHandler(fh) 

Pour être complet, voici un exemple d'implémentation, mais il semble maladroit me:

child = pexpect.spawn(cmd) 
while True: 
    try: 
     child.expect('\n') 
     print(child.before) 
    except pexpect.EOF: 
     break 

Répondre

0

EOF est frappé lorsque le processus enfant se termine. Pour obtenir la sortie en temps réel des commandes envoyées et des réponses reçues, vous pouvez enregistrer la sortie dans stdout ou un fichier.

La classe Spawn de Pexpect possède un attribut logfile_read qui écrit la sortie du processus enfant dans le fichier spécifié. Modifier le code comme indiqué ci-dessous fera l'affaire. J'utilise sys.stdout qui va tout imprimer sur la console. Vous pouvez ouvrir un fichier et l'utiliser ainsi

child = pexpect.spawn(cmd) 
child.logfile_read = sys.stdout 
while True: 
    try: 
     child.expect('\n') 
     print(child.after) 
    except pexpect.EOF: 
     break 

La raison pour laquelle le bloc while est encore nécessaire est parce que par fichier journal de documentation est rincée après chaque écriture. Étant donné que les écritures ne sont pas là, un appel à attendre provoquera le vidage dans le fichier.