У меня есть немного кода, который использует 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
страницы руководства: " Обратите внимание, однако, что буферизация может повлиять на это поведение, поскольку ввод поступает непредсказуемыми порциями». Таким образом, это может потенциально повлиять на ведение журнала.