端末との対話をログに記録する Python プログラム (スクリプト プログラムと同様) を作成しています。ログを XML 形式で保存したいと考えています。
問題は、端末の対話に VT100 エスケープ コードが含まれていることです。UTF-8 でエンコードされたファイルにデータを書き込んでも、Python は文句を言いません。
...
pid, fd = pty.fork()
if pid==0:
os.execvp("bash",("bash","-l"))
else:
# Lots of TTY-related stuff here
# see http://groups.google.com/group/comp.lang.python/msg/de40b36c6f0c53cc
fout = codecs.open("session.xml", encoding="utf-8", mode="w")
fout.write('<?xml version="1.0" encoding="UTF-8"?>\n')
fout.write("<session>\n")
...
r, w, e = select.select([0, fd], [], [], 1)
for f in r:
if f==fd:
fout.write("<entry><![CDATA[")
buf = os.read(fd, 1024)
fout.write(buf)
fout.write("]]></entry>\n")
else:
....
fout.write("</session>")
fout.close()
このスクリプトは、ファイルをディスクに書き込むという意味では「機能」しますが、結果のファイルは適切な utf-8 ではないため、etree などの XML パーサーがエスケープ コードをバーフします。
これに対処する 1 つの方法は、最初にエスケープ コードを除外することです。しかし、エスケープ コードが維持され、結果のファイルが etree のような XML ツールで解析できる場合、このようなことを行うことが可能でしょうか?