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: pexpect
manual 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.
İ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
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