Hi,<br><br>I&#39;d like to redirect stdout for my own custom purposes while in an ipython session.&nbsp; To do this, I would like to issue the command:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; &gt;&nbsp; sys.stdout = multicaster(,&#39;LogFile.txt&#39;, sys.__stdout__)<br>
<br>before going on do my business.&nbsp;&nbsp;&nbsp; The multicaster class (the code of which I provide below after this short explanation) is used to both log stdout output to a logfile (&#39;Log.txt&#39; in the example above) as _well_ as print to the screen.&nbsp; Basically when multicaster does is create a new object whose &quot;write&quot; method is like that of sys.__stdout__ but also includes writing to the log file. <br>
<br>When I do this at a regular python interpreter, it works fine as far as I can tell.&nbsp;&nbsp; However, in ipython it wrecks havoc on ipython&#39;s interactive before:&nbsp; the up, back, right, and left arrow keys produce output (&#39;[[A&#39; or the like) instead of their usual functions, the interactive warning after typing  &quot;quit()&quot; fails, etc....&nbsp;&nbsp; Before getting it to act normally, I have to issue the command:<br>
<br>&nbsp;&nbsp;&nbsp; &gt; sys.stdout = sys.__stdout__<br><br>and once I do this, all is normal again (though of course I&#39;ve lost my special logging feature).<br><br>It seems to me that the reason this is happening is probably that ipython has already replaced sys.stdout with an object having some special methods to achieve some of ipython&#39;s special interactive functionality, and my Multicaster class definition is overwriting those methods.&nbsp; (since after all I&#39;m not subclassing anything, the object I create just has one &quot;write&quot; method.)&nbsp;&nbsp; So I have two questions: <br>
<br>1) Is this explanation basically right? If so, how do I properly &quot;subclass&quot; ipython&#39;s object to simply modify the write method without killing the other methods. <br><br>2) If this explanation is not basically right, what is the reason, and how do I get around it? <br>
<br>Thanks!<br>Dan<br><br><br>class multicaster():<br>&nbsp;&nbsp;&nbsp; def __init__(self,filename,OldObject,New=False):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.file = filename<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.old = OldObject<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if New:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F = open(filename,&#39;w&#39;)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write(&#39;\n\n------------------------------------------------------------------------------------------------------------------------------------------------------\n&#39;)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write(&#39;STARTING LOG: &#39; + time.strftime(&#39;%c %Z&#39;) + &#39;\n&#39;)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write(&#39;------------------------------------------------------------------------------------------------------------------------------------------------------\n\n&#39;)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.close()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def write(self,s):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; self.old.write(s)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F = open(self.file,&#39;a&#39;)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write(s)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.close()<br>