私は Python でシステムを開発しています。必要な機能の 1 つは、コンソール出力をコンソールとユーザー指定のファイルの両方に送る機能です。これは、MATLAB の Diary 関数を複製しています。WindowsのIDLEとubuntuのpythonコマンドラインの両方で完全にうまく機能する次のものがあります(これはすべて、ロードされるモジュール内に存在します):
class diaryout(object):
def __init__(self):
self.terminal = sys.stdout
self.save = None
def __del__(self):
try:
self.save.flush()
self.save.close()
except:
# do nothing, just catch the error; maybe it self was instantiated, but never opened
1/1
self.save = None
def dclose(self):
self.__del__()
def write(self, message):
self.terminal.write(message)
self.save.write(message)
def dopen(self,outfile):
self.outfile = outfile
try:
self.save = open(self.outfile, "a")
except Exception, e:
# just pass out the error here so the Diary function can handle it
raise e
def Diary(outfile = None):# NEW TO TEST
global this_diary
if outfile == None:
# None passed, so close the diary file if one is open
if isinstance(this_diary, diaryout):
sys.stdout = this_diary.terminal # set the stdout back to stdout
this_diary.dclose() # flush and close the file
this_diary = None # "delete" it
else:
# file passed, so let's open it and set it for the output
this_diary = diaryout() # instantiate
try:
this_diary.dopen(outfile) # open & test that it opened
except IOError:
raise IOError("Can't open %s for append!"%outfile)
this_dairy=none # must uninstantiate it, since already did that
except TypeError:
raise TypeError("Invalid input detected - must be string filename or None: %s"%Diary.__doc__)
this_dairy=none # must uninbstantiate it, since already did that
sys.stdout = this_diary # set stdout to it
IDLE とプレーンな python cmline の両方よりもはるかに優れているため、私は ipython を使用しています。ここに私の問題があります。エラーなしで「日記」を完全に有効にできますが、コンソールの表示が乱れます。添付のスクリーンショットはこれを示しています。出力ファイルも同様に文字化けします。でリダイレクトを元に戻すと、すべてが正常に戻りDiary(None)
ます。私はコードを編集して、ファイルに書き込みさえしないようにしましたが、効果はありませんでした。サポートされていない文字セットまたは私が理解できない何かを強制しているようです。
誰でもこれについて考えがありますか?