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 pexpect
manual 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.
Ý 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
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