7

プロセスを制御するために使用するコードが少しあり、コードにpexpectいくつかの出力があります。(この質問での)主な目標は、pexpect出力と印刷物をログファイルに記録することです。私が遭遇した問題は、pexpect行 (送受信されたデータ) が明らかな論理なしに印刷物と混ざっていることです。印刷文字列とpexpect出力が発行された順序でログに記録されることを期待していました。

サンプルコードは次のとおりです。

#!/usr/bin/env python

import pexpect
import time, sys, os

###############################################################################
# Subclass of file object to avoid recording extensive whitespace characters
class CleanFile(file):
    def write (self, text):
        # Remove the whitespaces
        out_text = ''
        # process the backspace properly
        bline = ''
        for c in text:
            if (ord(c) == 0x8):
                if (len(bline) == 0):
                    # Move the file pointer.
                    file.seek(self, -1, os.SEEK_CUR);
                else:
                    bline = bline[:-1]
            else:
                bline += c

        # remove whitespaces from inside a line
        out_text += ''.join(c for c in bline if (ord(c) >= 32 or ord(c) == 10));

        file.write(self, out_text);

###############################################################################
def main():
    fout = CleanFile ("options.log_file.log", 'w')

    sys.stdout = os.fdopen (sys.stdout.fileno(), 'w', 0)
    os.dup2 (fout.fileno(), sys.stdout.fileno());

    p = pexpect.spawn ('tclsh')
    p.logfile = fout

    print "Got into tclsh."
    p.sendline('ls');
    p.expect (['%',pexpect.EOF])

    p.sendline('info tclversion');
    p.expect (['%',pexpect.EOF])

    print "Got the version\n"

    p.sendline('info commands %');
    p.expect (['%',pexpect.EOF])

    p.sendline('exit');

    print 'Ended session'

###############################################################################
if __name__ == "__main__":
    main()

出力ログ ファイルの内容は次のとおりです。

Got into tclsh.
ls
% lsinfo tclversion

log  options.log_file.log  pexpect_test.py  runtests.py  runtests_steinway.py
% info tclversionGot the version

info commands %

8.4
% info commands %exit
Ended session

pexpect出力と出力を連続させる方法はありますか?


更新:pexpect マニュアルページに基づく: 「ただし、入力が予測できないチャンクで到着するため、バッファリングがこの動作に影響を与える可能性があることに注意してください」. そのため、ロギングに影響を与える可能性があります。

4

1 に答える 1

4

スクリプトが結果を待つまで待つことができる場合は、pexpectコマンドのログファイルを設定せず、コマンドの結果を変数に保存し、最後にすべてを出力します。

コマンドの出力が欠落していることにも注意してくださいinfo commands。これは、tclshインタープリターの開始を待機するexpect()を1つ追加し、コマンドの最後から「%」を削除することで修正できます。それはタイプミスだと思いました。

main関数を次のように変更します。

def main():                                                          
    fout = CleanFile ("options.log_file.log", 'w')                   

    sys.stdout = os.fdopen (sys.stdout.fileno(), 'w', 0)             
    os.dup2 (fout.fileno(), sys.stdout.fileno());                    

    p = pexpect.spawn ('tclsh')                                      
    p.expect (['%',pexpect.EOF])                                     

    p.sendline('ls');                                                
    p.expect (['%',pexpect.EOF])                                     
    ls = p.before                                                    

    p.sendline('info tclversion');                                   
    p.expect (['%',pexpect.EOF])                                     
    tclversion = p.before                                            

    p.sendline('info commands');                                     
    p.expect (['%',pexpect.EOF])                                     
    commands = p.before                                              

    p.sendline('exit');                                              
    p.close()                                                        

    print "Got into tclsh."                                          
    print ls                                                         
    print tclversion                                                 
    print "Got the version\n"                                        
    print commands                                                   
    print "Ended session"                                            

その場合、出力は次のようになります。

Got into tclsh.                                                      
 ls                                                                  
options.log_file.log  pexpect_test.py                                

 info tclversion                                                     
8.5                                                                  

Got the version                                                      

 info commands                                           
tell socket subst open eof pwd glob list pid exec auto_load_index time unknown  
eval lassign lrange fblocked lsearch auto_import gets case lappend proc break v 
ariable llength auto_execok return linsert error catch clock info split array i 
f fconfigure concat join lreplace source fcopy global switch auto_qualify updat 
e close cd for auto_load file append lreverse format unload read package set bi 
nary namespace scan apply trace seek while chan flush after vwait dict continue 
 uplevel foreach lset rename fileevent regexp lrepeat upvar encoding expr unset 
 load regsub history interp exit puts incr lindex lsort tclLog string           

Ended session                                                        
于 2012-11-29T21:36:30.220 に答える