2016-06-24 12 views
0

デプロイスクリプトラッパーの1つで、pexpect(私が気づいていないものがあれば、完全に代替可能です)を検討中ですが、リアルタイムで出力を読む方法が必要です我々はEOFをヒットした。これはすべての環境で使用されるデプロイメントパッケージであるため、問題が発生するとすぐに問題を捕捉する必要があります(潜在的には非常停止の可能性があります)。pexpectをリアルタイムでどのように解析できますか?

私はこのようなことがありますか?理想的には、私は

完全については
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) 

は、ここでの実装例..です私たちの既存のロガーの使用をしたいのですが、それは私には不格好なようです:

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

答えて

0

EOFは、いつヒットしました子プロセスは終了する。送信されたコマンドと受信した応答のリアルタイム出力を得るには、出力をstdoutまたはファイルに記録することができます。

PexpectのSpawnクラスには、指定されたファイルに子プロセスの出力を書き込むlogfile_read属性があります。 以下のコードを変更すると、そのジョブが実行されます。私はコンソールにすべてを印刷するsys.stdoutを使用しています。あなたは、ファイルを開くと、同様

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

whileブロックがまだ必要とされている理由は、すべての書き込みの後にフラッシュされるため、ドキュメントのログファイルあたりのようであることを使用することができます。書き込みは存在しないので、expectを呼び出すとファイルがフラッシュされます。

関連する問題