ipython redirect повреждение отображения stdout

Я разрабатываю систему на python, и одна из необходимых мне функций - это возможность вывода вывода консоли как на консоль, так и в указанный пользователем файл. Это репликация функции дневника в MATLAB. У меня есть следующее, которое отлично работает как в IDLE в Windows, так и в командной строке python в ubuntu (все это существует внутри загружаемого модуля):

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

Я использую ipython, намного лучше, чем IDLE и простой cmline python; в этом моя проблема. Я могу включить "дневник" отлично, без ошибок, но отображение на консоли портится. На прилагаемом снимке экрана показан этот скриншот. Выходной файл также становится искаженным. Когда я отменяю перенаправление с помощью Diary(None), все возвращается в норму. Я попытался отредактировать код, чтобы он даже не записывался в файл, безрезультатно. Кажется, будто что-то заставляет использовать неподдерживаемый набор символов или что-то, чего я не понимаю.

Кто-нибудь знает об этом?


person Dr. Andrew    schedule 18.10.2012    source источник
comment
Обратите внимание, что IPython имеет встроенную функцию ведения журнала - взгляните на волшебную функцию %logstart.   -  person Thomas K    schedule 19.10.2012
comment
Я займусь этим. Однако я бы хотел, чтобы то, что я разрабатываю, не зависело от пользовательского интерфейса (т.е. для него НЕ должен требоваться ipython).   -  person Dr. Andrew    schedule 28.10.2012