2012-11-27 9 views
5

Tôi có một chút mã sử dụng pexpect để kiểm soát quá trình và một số bản in trong mã. Mục tiêu chính (trong câu hỏi này) là có đầu ra pexpect và các bản ghi được ghi vào một số tệp nhật ký. Vấn đề tôi gặp phải là các dòng pexpect (dữ liệu được gửi và nhận) được trộn lẫn với các bản in không có logic rõ ràng. Tôi đã mong rằng các chuỗi in và các đầu ra pexpect sẽ được ghi lại theo thứ tự chúng được phát hành.In và ghi nhật ký mong muốn

Mẫu mã như sau:

#!/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() 

Đây là sản phẩm nội dung file log:

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 

Có cách nào để làm cho tuần tự pexpect và đầu ra in?


Cập nhật: Căn cứ vào pexpectmanual page: "Xin lưu ý, tuy nhiên, đệm có thể ảnh hưởng đến hành vi này, kể từ đầu vào đến trong khối không thể đoán trước". Vì vậy, nó có thể có khả năng ảnh hưởng đến việc đăng nhập.

Trả lời

2

Nếu bạn có thể đợi cho đến khi tập lệnh kết thúc cho kết quả, không đặt tệp nhật ký cho lệnh pexpect, lưu kết quả của lệnh vào biến và in mọi thứ ở cuối.

Cũng lưu ý rằng bạn thiếu đầu ra của lệnh info commands. Điều này có thể được sửa bằng cách thêm một hàm mong đợi() để đợi trình thông dịch tclsh bắt đầu và loại bỏ '%' từ cuối lệnh. Tôi cho rằng đó là một lỗi đánh máy.

Sửa đổi chức năng chính là:

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"            

Kết quả là sau đó:

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               
+0

Ý tưởng tốt. Sẽ chỉ in ngay lập tức làm việc quá? Sau đó nó sẽ được điều khiển bằng phương thức 'in'. Một câu hỏi tôi có là: nên sử dụng 'p.before + p.match + p.after'? – ilya1725

+0

In ngay lập tức không hoạt động vì dữ liệu được trả về không đồng bộ giống như trong tập lệnh gốc của bạn. p.trước khi trả về mọi thứ trước chuỗi kết hợp. Khi chuỗi phù hợp là dấu nhắc, tất cả các đầu ra lệnh đã đến trước đó. – Edu