<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>Le 2 déc. 2012 à 00:17, Zachary Charlop-Powers a écrit :</div><br class="Apple-interchange-newline"><blockquote type="cite">

<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">

<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
I recently posted a question to Stack Overflow about the possibility of using iPython to generate reproducible, repetitive reports. (<a href="http://stackoverflow.com/questions/13614783/programatically-add-cells-to-an-ipython-notebook-for-report-generation">http://stackoverflow.com/questions/13614783/programatically-add-cells-to-an-ipython-notebook-for-report-generation</a>)
 Lets say that I have a number of Pandas data frames and for each data frame I want to generate a series of tables , graphs and text, and then combine these into a report. I could use a templating system like Jinja but I am curious to know if I could use the
 iPython framework of ipython-notebook ---&gt; nbconverter ---&gt; pdf/html/etc for the purpose of generating all of the data analyses and the report into a single document.&nbsp;<span style="text-align: left; ">I have followed Thomas K.'s suggestion to use the&nbsp;</span><span style="text-align: left; background-color: rgb(238, 238, 238); "><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif" size="4"><span style="line-height: 18px; ">get_ipython().set_next_input()</span></font></span><span style="text-align: left; ">&nbsp;function
 to add text to the next code block. For my idea to work, a few things would need to work:</span>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">example code.</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">
<div>from IPython.core.display import Image, display_png</div>
<div>x = Image(filename='test.png')</div>
</div>
<div style="text-align: left; ">for i in range(3):</div>
<div style="text-align: left; "><span class="Apple-tab-span" style="white-space: pre; "></span>x = Image(filename='/Users/zachpowers/Downloads/pics/Sieve_1.png')&nbsp;</div>
<div style="text-align: left; "><span class="Apple-tab-span" style="white-space: pre; "></span>&nbsp;get_ipython().set_next_input('Thats What I am Talking About!')&nbsp;</div></div></blockquote><div><br></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; "><span class="Apple-tab-span" style="white-space: pre; "></span>&nbsp;get_ipython().set_next_input(display_png(x))</div></div></blockquote><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; "><span class="Apple-tab-span" style="white-space: pre; "></span></div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">if you run this you will see that there are a few different problems that you encounter.</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">1) you can't create Markdown cells &nbsp;</div></div></blockquote><div><br></div><div>We want to keep kernel separate from fronted, so we'll keep it as less aware as the frontend as possible. So adding MD cell to a kernel method is unlikely.</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; ">2) the display_png() function does not respect the .set_next_input() function so they are all displayed in the same output block in which they are called</div></div></blockquote><div><br></div><div><div>Display_png does not 'return' a value to be displayed, it send the png to the display channel.&nbsp;</div><div>So it is normal that it does not put the png in the next cell.&nbsp;</div><div><br></div><div>Btw it is set next **input** so by definition is does only works on input so only with text.&nbsp;</div><div><br></div></div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; ">3) the .set_next_input() function would need to be modified to track which code blocks it insert. &nbsp;It iterates over the loop and inserts a code block below the code block it sits in with the result that the code blocks are added
 in reverse order from expected.</div></div></blockquote><div><br></div><div>same as 1.</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; ">4) there would need to be a way to hide the code-block that calls the rest of the functions.</div>
<div style="text-align: left; ">5) you would probably still need a templating engine to generate interesting text of each markdown block</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">So in closing I think the python ---&gt; nbconvert is a great tool and that it might potentially be useful for reproducible research of repetitive reports (say that five times fast). I think that a few tweaks to the ipython notebook
 might make this possible and that the benefit would be the creation of a single file from which analyses could be rerun and from which reports could be generated. However, upon writing up my thoughts I am not sure that this is easier than doing the analysis
 in one file and outputting the results via a separate templating system.&nbsp;</div></div></blockquote><div><br></div><div>IIUC, you are seeing this the wrong way.&nbsp;</div><div><br></div><div>You can generate .ipynb file without ever going through the &nbsp;browser.</div><div>Trying to "pilot" the browser to do that is overcomplicated.</div><div><br></div><div>ipynb files are "simple" Json files you can manipulate/create as you wish.&nbsp;</div><div><br></div><div>What you want is a headless program that taking a template .ipynb files and somme command modify it.&nbsp;</div><div>See some example here :&nbsp;</div><div><a href="http://wiki.ipython.org/Notebook_feedback">http://wiki.ipython.org/Notebook_feedback</a></div><div>of gist modifying ipynb structure, or ever re-running ipynb files in a headless manner.</div><div><br></div><div>What do you think ?</div><div>--&nbsp;</div><div>Matthias</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">I hope some of the iPython community might find this line of thought to be useful and if so we could try to implement some of these ideas.</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; "><br>
</div>
<div style="text-align: left; ">thanks,</div>
<div style="text-align: left; ">zach cp</div>
<br>
<br>
<div apple-content-edited="true"><br class="Apple-interchange-newline">
<br class="Apple-interchange-newline">
</div>
<br>
</div>

_______________________________________________<br>IPython-User mailing list<br><a href="mailto:IPython-User@scipy.org">IPython-User@scipy.org</a><br>http://mail.scipy.org/mailman/listinfo/ipython-user<br></blockquote></div><br></body></html>