プロセスを制御するために使用するコードが少しあり、コードに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
マニュアルページに基づく: 「ただし、入力が予測できないチャンクで到着するため、バッファリングがこの動作に影響を与える可能性があることに注意してください」. そのため、ロギングに影響を与える可能性があります。