<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=FR link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi Dan,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>From what I&#8217;ve seen of ipython code, seems right for me,
so the idea is to keep sending to sys.stdout  because ipython redefine it.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>So, the only problem I see with your code is that you use </span><span
lang=EN-US>sys.__stdout__ that always return the python initial stdout and not
the one ipython use.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>So on your code you where sending your log
to the original stdout without passing by ipython function, that&#8217;s why
you get the messy output.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Have you tried something like (not tested yet):<o:p></o:p></span></p>

<p class=MsoNormal>ipython_sys_stdout = sys.stdout<span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p>

<p class=MsoNormal>sys.stdout = multicaster(,'LogFile.txt', ipython_sys_stdout)<o:p></o:p></p>

<p class=MsoNormal>?<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Laurent<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De&nbsp;:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ipython-user-bounces@scipy.org [mailto:ipython-user-bounces@scipy.org] <b>De la
part de</b> Dan Yamins<br>
<b>Envoyé&nbsp;:</b> dimanche 8 février 2009 18:43<br>
<b>À&nbsp;:</b> ipython-user@scipy.org<br>
<b>Objet&nbsp;:</b> [IPython-user] Modifying stdout<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Hi,<br>
<br>
I'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(,'LogFile.txt',
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 ('Log.txt' 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's interactive
before:&nbsp; the up, back, right, and left arrow keys produce output ('[[A' 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'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's special interactive functionality, and my Multicaster
class definition is overwriting those methods.&nbsp; (since after all I'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'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,'w')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
F.write('\n\n------------------------------------------------------------------------------------------------------------------------------------------------------\n')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write('STARTING LOG:
' + time.strftime('%c %Z') + '\n')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
F.write('------------------------------------------------------------------------------------------------------------------------------------------------------\n\n')<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,'a')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.write(s)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; F.close()<o:p></o:p></p>

</div>

</div>

</body>

</html>