[IPython-dev] use of InteractiveShell and R magic

Brian Granger ellisonbg at gmail.com
Thu Jun 14 20:34:29 EDT 2012


On Thu, Jun 14, 2012 at 5:07 PM, MinRK <benjaminrk at gmail.com> wrote:
>
>
> On Thu, Jun 14, 2012 at 4:30 PM, Brian Granger <ellisonbg at gmail.com> wrote:
>>
>> But don't we have similar assumptions about InteractiveShell being a
>> singleton throughout the code base.  The patterns used by the magic
>> system are by no means unique.  I am not sure I would call this a bug.
>
>
> 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't have
> any singleton-like instance() api like the InteractiveShell does.

Ahh, OK I agree that this is not ideal.  Just saw your PR to fix this.

Cheers,

Brian

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



-- 
Brian E. Granger
Cal Poly State University, San Luis Obispo
bgranger at calpoly.edu and ellisonbg at gmail.com



More information about the IPython-dev mailing list