Mam trochę kodu, który używa pexpect
do kontrolowania procesu i niektórych wydruków w kodzie. Głównym celem (w tym pytaniu) jest, aby dane wyjściowe i wydruki były zapisywane w jakimś pliku dziennika. Problemem, który napotkałem, jest to, że linie pexpect
(dane wysyłane i odbierane) mieszają się z wydrukami bez widocznej logiki. Spodziewałem się, że ciągi wydruków i dane wyjściowe pexpect
zostaną zarejestrowane w kolejności, w jakiej zostały wydane.Drukuj i pexpect logowanie
Przykładowy kod jest następujący:
#!/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()
To wyjście zawartość pliku dziennika:
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
jest jakiś sposób, aby pexpect
i wyjść wydruk sekwencyjny?
Aktualizacja: Na podstawie pexpect
manual page: „Należy jednak pamiętać, że buforowanie może wpływać na ten problem, ponieważ wejście przybywa nieprzewidywalnych kawałki”. Może to potencjalnie wpłynąć na rejestrację.
Dobry pomysł. Czy drukowanie będzie od razu działać? Powinien być wtedy kontrolowany metodą "print". Mam jedno pytanie: czy należy użyć 'p.befef + p.match + p.after'? – ilya1725
Drukowanie od razu nie działa, ponieważ dane są zwracane asynchronicznie, tak jak w oryginalnym skrypcie. p.before zwraca wszystko przed dopasowanym ciągiem. Ponieważ dopasowany ciąg znaków jest monitem, wszystkie dane wyjściowe polecenia zostały już wcześniej przesłane. – Edu