[IPython-User] redirect stdout display corruption

Andrew Howe ahowe42@gmail....
Mon Oct 29 08:55:34 CDT 2012


I'm developing a system in python, and one functionality I need is the
ability to have console output go to both the console and a user-specified
file. This is replicating the Diary function in MATLAB. I have the
following that works perfectly well on both IDLE on windows and python
cmdline in ubuntu (this all exists inside a module that gets loaded):

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

Far superior to both IDLE and the plain python cmline, I'm using ipython;
herein my problem lies. I can turn on the "diary" perfectly fine with no
error *but* the display on the console gets messed. The attached screenshot
shows this [image: screenshot]. The output file also becomes similarly
garbled. Everything goes back to normal when I undo the redirection with
Diary(None). I have tried editing the code so that it never even writes to
the file, with no effect. It seems almost like something is forcing an
unsupported character set or something I don't understand.

Anyone have an idea about this?

<~~~~~~~~~~~~~~~~~~~~~~~~~~~>
J. Andrew Howe, PhD
Editor-in-Chief, European Journal of Mathematical Sciences
Associate Editor, European Journal of Pure and Applied Mathematics
www.andrewhowe.com
I live to learn, so I can learn to live. - me
<~~~~~~~~~~~~~~~~~~~~~~~~~~~>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/ipython-user/attachments/20121029/2c3c0d75/attachment.html 


More information about the IPython-User mailing list