<br><br><div class="gmail_quote">On Thu, Jun 14, 2012 at 4:30 PM, Brian Granger <span dir="ltr">&lt;<a href="mailto:ellisonbg@gmail.com" target="_blank">ellisonbg@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

But don&#39;t we have similar assumptions about InteractiveShell being a<br>
singleton throughout the code base.  The patterns used by the magic<br>
system are by no means unique.  I am not sure I would call this a bug.<br></blockquote><div><br></div><div>The relevant assumption is that the Magics object itself is a singleton.  The magics table is *per class*, but on initialization of the first instance, the class mapping clobbered with the methods of the first instance.  Simply copying the magics dict before altering it so that it is an instance attribute rather than a class attribute edited by the instance fixes the issue. I think this is inappropriate for a class that doesn&#39;t have any singleton-like instance() api like the InteractiveShell does.</div>

<div><br></div><div>For instance:</div><div><br></div><div>from IPython.core.magic import magics_class, Magics, line_magic</div><div>@magics_class</div><div>class MyMagic(Magics):</div><div><br></div><div>    @line_magic</div>

<div>    def foo(self, line):</div><div>        print &#39;hi&#39;</div><div><br></div><div>magic = MyMagic(None)</div><div>magic2 = MyMagic(None)</div><div><br></div><div>assert magic2.magics[&#39;line&#39;][&#39;foo&#39;].im_self is not magic # fails</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Brian<br>
<div><div class="h5"><br>
On Thu, Jun 14, 2012 at 4:26 PM, MinRK &lt;<a href="mailto:benjaminrk@gmail.com">benjaminrk@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Thu, Jun 14, 2012 at 3:57 PM, Jonathan Taylor<br>
&gt; &lt;<a href="mailto:jonathan.taylor@stanford.edu">jonathan.taylor@stanford.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Thanks, that seems to work in a separate python process rather than the<br>
&gt;&gt; ipython process:<br>
&gt;&gt;<br>
&gt;&gt; ~/workbook (metadata*) $ python -c &quot;import<br>
&gt;&gt; IPython.frontend.terminal.interactiveshell as IS; shell =<br>
&gt;&gt; IS.TerminalInteractiveShell(); shell.run_cell(&#39;%load_ext rmagic&#39;);<br>
&gt;&gt; shell.run_cell(&#39;%R X=rnorm(20); print(X)&#39;)&quot;<br>
&gt;&gt;  [1]  0.2125483  0.1030451 -1.4036373 -0.5617847 -0.7571675 -0.3985085<br>
&gt;&gt;  [7] -0.4386932  0.7164915 -0.4794236 -0.1373804  0.2831013 -0.7248862<br>
&gt;&gt; [13]  0.5260675 -0.3789804  0.1535592  1.5569203  1.0225972  0.8149846<br>
&gt;&gt; [19] -0.9629060 -0.4161373<br>
&gt;&gt;<br>
&gt;&gt; ~/workbook (metadata*) $ python -c &quot;import<br>
&gt;&gt; IPython.frontend.terminal.interactiveshell as IS; shell =<br>
&gt;&gt; IS.InteractiveShell(); shell.run_cell(&#39;%load_ext rmagic&#39;);<br>
&gt;&gt; shell.run_cell(&#39;%R X=rnorm(20); print(X)&#39;)&quot;<br>
&gt;&gt;  [1]  0.44037484  1.31372601 -0.37253955  2.21955270 -0.07886852<br>
&gt;&gt; -0.09022193<br>
&gt;&gt;  [7]  0.38464850 -0.41004855  1.62648041 -0.13687832  0.91537699<br>
&gt;&gt; -2.70125217<br>
&gt;&gt; [13]  1.49125226  0.11580012 -0.64993087  2.49367657  0.01447792<br>
&gt;&gt;  0.57408249<br>
&gt;&gt; [19] -0.80559871 -0.76346964<br>
&gt;&gt;<br>
&gt;&gt; So, for interactively running this in ipython I should expect to see this<br>
&gt;&gt; load_ext failure?<br>
&gt;&gt;<br>
&gt;<br>
&gt; You are running into some singleton assumptions in the new magics system -<br>
&gt; each Magics class methods are only registered once, and thus bound to the<br>
&gt; first Shell that load the magic.<br>
&gt;<br>
&gt; So what you are seeing is that shell.magic(&quot;load_ext rmagic&quot;) is actually<br>
&gt; triggering the load_ext magic on the *original* IPython instance.  I think<br>
&gt; this should be considered a bug.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt;<br>
&gt;&gt; Jonathan<br>
&gt;&gt;<br>
&gt;&gt; On Thu, Jun 14, 2012 at 3:48 PM, Thomas Kluyver &lt;<a href="mailto:takowl@gmail.com">takowl@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On 14 June 2012 23:44, Jonathan Taylor &lt;<a href="mailto:jonathan.taylor@stanford.edu">jonathan.taylor@stanford.edu</a>&gt;<br>
&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt; Actually, I want to create an InteractiveShell inside another python<br>
&gt;&gt;&gt; &gt; process. Maybe I should use embed?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Embed&#39;s not terribly relevant here - that creates an InteractiveShell,<br>
&gt;&gt;&gt; but attempts to use the namespace from which it&#39;s called.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Try it in a separate Python process. Don&#39;t forget to %load_ext rmagic<br>
&gt;&gt;&gt; first.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thomas<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; IPython-dev mailing list<br>
&gt;&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Jonathan Taylor<br>
&gt;&gt; Dept. of Statistics<br>
&gt;&gt; Sequoia Hall, 137<br>
&gt;&gt; 390 Serra Mall<br>
&gt;&gt; Stanford, CA 94305<br>
&gt;&gt; Tel:   <a href="tel:650.723.9230" value="+16507239230">650.723.9230</a><br>
&gt;&gt; Fax:   <a href="tel:650.725.8977" value="+16507258977">650.725.8977</a><br>
&gt;&gt; Web: <a href="http://www-stat.stanford.edu/~jtaylo" target="_blank">http://www-stat.stanford.edu/~jtaylo</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; IPython-dev mailing list<br>
&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;<br>
<br>
<br>
<br>
--<br>
</div></div>Brian E. Granger<br>
Cal Poly State University, San Luis Obispo<br>
<a href="mailto:bgranger@calpoly.edu">bgranger@calpoly.edu</a> and <a href="mailto:ellisonbg@gmail.com">ellisonbg@gmail.com</a><br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
IPython-dev mailing list<br>
<a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
</div></div></blockquote></div><br>