2012-11-27 21 views
5

Bir işlemi ve koddaki bazı baskıları denetlemek için pexpect kullanan bir kod biraz var. Ana hedef (bu soruda), pexpect çıkışına sahip olmak ve bazı günlük dosyalarına yazdırmaktır. Karşılaştığım sorun, pexpect satırlarının (gönderilen ve alınan verilerin) görünür mantığa sahip olmayan baskılarla karıştırılmasıdır. Yazdırma dizgileri ve pexpect çıkışlarının verildikleri sırada kaydedileceğini bekledim.Yazdırma ve pexpect günlüğü

Örnek kod şudur:

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

Bu çıkış günlük dosyası içeriği olan:

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 ve baskı çıkışları sıralı yapmak için herhangi bir yolu var mı?


Güncelleme: pexpectmanual page dayanarak: " giriş öngörülemeyen parçalar geldiğinde beri dikkat edin, ancak, o tamponlama Bu davranışı etkileyebilir". Dolayısıyla, günlüğe kaydetmeyi potansiyel olarak etkileyebilir.

cevap

2

Komut dosyası sonuçlar için bitene kadar bekleyebilirseniz, pexpect komutları için bir günlük dosyası ayarlamayın, komutların sonuçlarını değişkenlere kaydedin ve her şeyi sonuna yazdırın.

Ayrıca, info commands komutunun çıktısını kaçırdığınızı unutmayın. Bu, tclsh yorumlayıcısını komutun sonundan '%' 'yi başlatmak ve kaldırmak için beklemek için bir bekle() ekleyerek giderilebilir. Bir yazım hatası olduğunu farz ettim.

olmaya ana işlevi değiştirin:

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"            

çıktı o zaman:

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

İyi fikir. Hemen yazdırmak da işe yarayacak mı? Daha sonra 'print' yöntemi ile kontrol edilmelidir. Bir sorum var: p.match + p.after kullanılmadan önce? – ilya1725

+0

Baskı hemen çalışmaz, çünkü veri orijinal komut dosyanızdaki gibi eşzamansız olarak döndürülür. p.before eşleşen dizeden önce her şeyi döndürür. Eşleşen dizi komut istemi olduğundan, tüm komut çıktısı zaten bundan önce geldi. – Edu