2016-06-24 20 views
0

Ich erwäge pexpect (völlig offen für Alternativen, wenn es bessere gibt, die mir nicht bekannt sind) in einem unserer Deploy-Skript Wrapper - aber ich brauche eine Möglichkeit, die Ausgabe in Echtzeit zu lesen, nicht nur Sobald wir die EOF getroffen haben. Da es sich um ein Bereitstellungspaket handelt, das für alle Umgebungen verwendet wird, müssen wir Probleme sofort erkennen, wenn sie auftreten (und möglicherweise den Notausgang treffen, wenn es wirklich schlecht ist).Wie kann ich Pexpect in Echtzeit analysieren?

Gibt es so etwas, das ich verwenden kann? Im Idealfall würde Ich mag Nutzung unserer bereits vorhandenen Logger machen ..

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) 

Für Vollständigkeit, hier ist ein Beispiel-Implementierung, aber es scheint mir klobig:

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

Antwort

0

EOF getroffen wird, wenn Der Kindprozess wird beendet. Um eine Echtzeitausgabe der gesendeten Befehle und empfangenen Antworten zu erhalten, können Sie die Ausgabe in stdout oder eine Datei protokollieren.

Spawn-Klasse von Pexpect hat ein logfile_read-Attribut, das die Ausgabe des untergeordneten Prozesses in die angegebene Datei schreibt. Ändern Sie den Code wie unten gezeigt, um den Job zu erledigen. Ich verwende sys.stdout, das alles auf die Konsole ausgibt. Sie können eine Datei öffnen und verwenden, die auch

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

Der Grund der while Block immer noch da als je Dokumentation Logfile ist erforderlich ist, wird nach jedem Schreib gespült. Da keine Schreibvorgänge vorhanden sind, führt ein zu erwartender Aufruf zum Leeren der Datei.