<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>On 3 nov. 2011  15:27, Thomas Kluyver wrote :</div><div><br></div><div><br></div><div><blockquote type="cite"><div class="gmail_quote"><div>In Python, there are two kinds of output: firstly from "print x", for which you can simply redirect stdout - replace sys.stdout with an object with a .write() method, which will capture strings written to it and display them in your console.<br><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#144FAE"><br></font></font></div></div></blockquote>This one is "easy", and it works</div><div><br></div><div><blockquote type="cite"><div class="gmail_quote"><div>Secondly, if you simply enter "x" at a prompt, IPython displays the value of x at an "Out [n]:" prompt. In such cases, Python calls sys.displayhook. This is called with the object itself, rather than its repr, so you can produce more complex displays. This is how we pretty-print datastructures, and also how the notebook can display rich objects like youtube videos. Have a look at IPython.core.displayhook to see our implementation of this. If you replace the displayhook attribute of an InteractiveShell object, it will take care of using that displayhook when you call run_cell.<font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#144FAE"><br></font></font></div></div></blockquote><br></div><div>I have some problem using this last advice for redirection. Let me explain.</div><div><div><div>If I override sys.stdout before creating the InteractiveShell, then it fails :</div><div><br></div><div><div>/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.pyc in init_io(self)</div><div>&nbsp;&nbsp; &nbsp;568 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; io.stdout = io.stderr = io.IOStream(self.readline._outputfile)</div><div>&nbsp;&nbsp; &nbsp;569 &nbsp; &nbsp; &nbsp; &nbsp; else:</div><div>--&gt; 570 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; io.stdout = io.IOStream(sys.stdout)</div><div>&nbsp;&nbsp; &nbsp;571 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; io.stderr = io.IOStream(sys.stderr)</div><div>&nbsp;&nbsp; &nbsp;572&nbsp;</div><div><br></div><div>/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/utils/io.pyc in __init__(self, stream, fallback)</div><div>&nbsp;&nbsp; &nbsp; 30 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stream = fallback</div><div>&nbsp;&nbsp; &nbsp; 31 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:</div><div>---&gt; 32 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise ValueError("fallback required, but not specified")</div><div>&nbsp;&nbsp; &nbsp; 33 &nbsp; &nbsp; &nbsp; &nbsp; self.stream = stream</div><div>&nbsp;&nbsp; &nbsp; 34 &nbsp; &nbsp; &nbsp; &nbsp; self._swrite = stream.write</div><div><br></div><div>ValueError: fallback required, but not specified</div><div><br></div></div><div>If I override sys.stdout after creating the Interactive Shell (sharing or not the sys variable with the interactive shell I am creating), it does not crash but the display_hook does not use my newly defined sys.stdout and keeps the old one...</div><div><br></div><div>===============</div><div><br></div><div>From what I understand, it looks like when the InteractiveShell is created, the sys.stdout is used to build an IOStream object (via&nbsp;io.stdout = io.IOStream(sys.stdout)) that will be used by the display_hook of the interactiveShell. ?</div><div>Is that right?</div><div><br></div><div>How do I redirect the printing of the default display_hook to my new sys.stdout (I don't want to go into implementing a new display_hook) ?</div><div><br></div><div>Thank you</div><div>Emmanuel</div><div><br></div></div></div></body></html>