<div dir="ltr"><div class="markdown-here-wrapper" style><p style="margin:1.2em 0px!important">I think if you want to add something like magics for Python-wrapped kernels based on your magickernel.py code, that would be interesting. Standardizing magics across kernel languages is something that is attractive on its face, but we deemed outside the scope of the message / kernel specification, because it is probably not feasible to do in a language agnostic way (For example, IPython magics can contain Python string-formatting code with Python expressions that are evaluated in the interactive namespace).  Clarification of discussions like this are part of the reasoning behind the Jupyter/IPython split:</p>


<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">Jupyter is language-agnostic computing tools, such as the message protocol, notebook document format, and notebook UI.</li>
<li style="margin:0.5em 0px">IPython is a better interactive Python environment, with some extensions to the Python language for interactive use.</li>
<li style="margin:0.5em 0px">IPython provides a Jupyter Kernel.</li>
<li style="margin:0.5em 0px">Magics are 100% an IPython feature, and not in any way related to Jupyter.</li>
<li style="margin:0.5em 0px">Other kernels are welcome to implement extensions to their language (including Python!) as they see fit,<br>as similar or different to IPython’s magics system as makes sense.</li>
</ul>
<p style="margin:1.2em 0px!important">Implementing magics for basic Python-wrapped kernels (i.e. not R, Julia, Ruby, Haskell, etc.) would be simple, and potentially useful, depending on how many of these kernels are developed. I do not expect most first-class kernels to go this route, in which case they would not share any magic code. Further, I don’t think the magic code developed for this use case would even be shared by IPython.</p>


<p style="margin:1.2em 0px!important">But it would still be an interesting exercise, and might encourage other kernels to take the multi-interpreter approach if it is successful.</p>
<p style="margin:1.2em 0px!important">Sounds like a fun experiment!</p>
<p style="margin:1.2em 0px!important">-MinRK</p>
<div title="MDH:SSB0aGluayBpZiB5b3Ugd2FudCB0byBhZGQgc29tZXRoaW5nIGxpa2UgbWFnaWNzIGZvciBQeXRo
b24td3JhcHBlZCBrZXJuZWxzIGJhc2VkIG9uIHlvdXIgbWFnaWNrZXJuZWwucHkgY29kZSwgdGhh
dCB3b3VsZCBiZSBpbnRlcmVzdGluZy4gU3RhbmRhcmRpemluZyBtYWdpY3MgYWNyb3NzIGtlcm5l
bCBsYW5ndWFnZXMgaXMgc29tZXRoaW5nIHRoYXQgaXMgYXR0cmFjdGl2ZSBvbiBpdHMgZmFjZSwg
YnV0IHdlIGRlZW1lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgbWVzc2FnZSAvIGtlcm5lbCBz
cGVjaWZpY2F0aW9uLCBiZWNhdXNlIGl0IGlzIHByb2JhYmx5IG5vdCBmZWFzaWJsZSB0byBkbyBp
biBhIGxhbmd1YWdlIGFnbm9zdGljIHdheSAoRm9yIGV4YW1wbGUsIElQeXRob24gbWFnaWNzIGNh
biBjb250YWluIFB5dGhvbiBzdHJpbmctZm9ybWF0dGluZyBjb2RlIHdpdGggUHl0aG9uIGV4cHJl
c3Npb25zIHRoYXQgYXJlIGV2YWx1YXRlZCBpbiB0aGUgaW50ZXJhY3RpdmUgbmFtZXNwYWNlKS4g
wqBDbGFyaWZpY2F0aW9uIG9mIGRpc2N1c3Npb25zIGxpa2UgdGhpcyBhcmUgcGFydCBvZiB0aGUg
cmVhc29uaW5nIGJlaGluZCB0aGUgSnVweXRlci9JUHl0aG9uIHNwbGl0OjxkaXY+PGJyPjwvZGl2
PjxkaXY+LSBKdXB5dGVyIGlzIGxhbmd1YWdlLWFnbm9zdGljIGNvbXB1dGluZyB0b29scywgc3Vj
aCBhcyB0aGUgbWVzc2FnZSBwcm90b2NvbCwgbm90ZWJvb2sgZG9jdW1lbnQgZm9ybWF0LCBhbmQg
bm90ZWJvb2sgVUkuPC9kaXY+PGRpdj4tIElQeXRob24gaXMgYSBiZXR0ZXIgaW50ZXJhY3RpdmUg
UHl0aG9uIGVudmlyb25tZW50LCB3aXRoIHNvbWUgZXh0ZW5zaW9ucyB0byB0aGUgUHl0aG9uIGxh
bmd1YWdlIGZvciBpbnRlcmFjdGl2ZSB1c2UuPC9kaXY+PGRpdj4tIElQeXRob24gcHJvdmlkZXMg
YSBKdXB5dGVyIEtlcm5lbC48L2Rpdj48ZGl2Pi0gTWFnaWNzIGFyZSAxMDAlIGFuIElQeXRob24g
ZmVhdHVyZSwgYW5kIG5vdCBpbiBhbnkgd2F5IHJlbGF0ZWQgdG8gSnVweXRlci48L2Rpdj48ZGl2
Pi0gT3RoZXIga2VybmVscyBhcmUgd2VsY29tZSB0byBpbXBsZW1lbnQgZXh0ZW5zaW9ucyB0byB0
aGVpciBsYW5ndWFnZSAoaW5jbHVkaW5nIFB5dGhvbiEpIGFzIHRoZXkgc2VlIGZpdCw8L2Rpdj48
ZGl2PiZuYnNwOyBhcyBzaW1pbGFyIG9yIGRpZmZlcmVudCB0byBJUHl0aG9uJ3MgbWFnaWNzIHN5
c3RlbSBhcyBtYWtlcyBzZW5zZS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkltcGxlbWVudGlu
ZyBtYWdpY3MgZm9yIGJhc2ljIFB5dGhvbi13cmFwcGVkIGtlcm5lbHMgKGkuZS4gbm90IFIsIEp1
bGlhLCBSdWJ5LCBIYXNrZWxsLCBldGMuKSB3b3VsZCBiZSBzaW1wbGUsIGFuZCBwb3RlbnRpYWxs
eSB1c2VmdWwsIGRlcGVuZGluZyBvbiBob3cgbWFueSBvZiB0aGVzZSBrZXJuZWxzIGFyZSBkZXZl
bG9wZWQuIEkgZG8gbm90IGV4cGVjdCBtb3N0IGZpcnN0LWNsYXNzIGtlcm5lbHMgdG8gZ28gdGhp
cyByb3V0ZSwgaW4gd2hpY2ggY2FzZSB0aGV5IHdvdWxkIG5vdCBzaGFyZSBhbnkgbWFnaWMgY29k
ZS4gRnVydGhlciwgSSBkb24ndCB0aGluayB0aGUgbWFnaWMgY29kZSBkZXZlbG9wZWQgZm9yIHRo
aXMgdXNlIGNhc2Ugd291bGQgZXZlbiBiZSBzaGFyZWQgYnkgSVB5dGhvbi48L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2PkJ1dCBpdCB3b3VsZCBzdGlsbCBiZSBhbiBpbnRlcmVzdGluZyBleGVyY2lz
ZSwgYW5kIG1pZ2h0IGVuY291cmFnZSBvdGhlciBrZXJuZWxzIHRvIHRha2UgdGhlIG11bHRpLWlu
dGVycHJldGVyIGFwcHJvYWNoIGlmIGl0IGlzIHN1Y2Nlc3NmdWwuPC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5Tb3VuZHMgbGlrZSBhIGZ1biBleHBlcmltZW50ITwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+LU1pblJLPC9kaXY+" style="height:0;font-size:0em;padding:0;margin:0">​</div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 20, 2014 at 4:22 AM, Doug Blank <span dir="ltr"><<a href="mailto:doug.blank@gmail.com" target="_blank">doug.blank@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>IPython developers,</div><div><br></div><div>One of the nice things that the IPython team did for the next version was to create a base class for creating new kernels for code written in Python, called wrapper kernels [1]. </div>


<div><br></div><div>Unfortunately, such kernels don't have ! shell commands, nor magics. This is understandable, as those are tightly integrated with IPython's Python. However, one could get some of the basic functionality of these features on top of the wrapper kernel, in a generic way. For example, you could run shell commands, or have some magics that operate independent of the kernel.</div>


<div><br></div><div>We have created a prototype of magics for wrapper kernels [2]. The code is in magickernel.py, and the magics are in the folder magics. The current prototype works like this:</div><div><br></div><div>```</div>


<div><div>In [1]: %magics</div><div>Line magics:</div><div>     %cd PATH - change current directory of session</div><div>     %connect_info - show connection information</div><div>     %download URL [FILENAME] - download file from URL</div>


<div>     %html CODE - display code as HTML</div><div>     %install_magic URL - download and install magic from URL</div><div>     %javascript CODE - send code as JavaScript</div><div>     %latex TEXT - display text as LaTex</div>


<div>     %magics - show installed magics</div><div>     %reload_magics - reload the magics from the installed files</div><div>     %shell COMMAND - run the line as a shell command</div><div>     %time COMMAND - show time to run line</div>


<div><br></div><div>Cell magics:</div><div>    %%file FILENAME - write contents of cell to file</div><div>    %%html - display contents of cell as HTML</div><div>    %%javascript - send contents of cell as JavaScript</div>


<div>    %%latex - display contents of cell as LaTeX</div><div>    %%shell - run the contents of the cell as shell commands</div><div>    %%time - show time to run cell</div><div><br></div><div>Shell shortcut:</div><div>

    ! COMMAND ... - execute command in shell</div>
<div><br></div><div>Any cell magic can be made persistent for rest of session by using %%% prefix.</div></div><div>```<br></div><div><br></div><div>The idea is to be able to easily add some standard-like magics to 3rd-party kernels by using MagicKernel. See the sample wrapperkernel EchoKernel with magics [3]. Also, the idea here is not to replicate too much what comes with IPython's Python, but to provide a small, simple core set of magics that can't be easily done in the kernel language. You can install MagicKernel from source, or using:</div>


<div><br></div><div>$ pip install calico --upgrade</div><div><br></div><div>This is a prototype (with some bugs), and we very much hope for others to provide feedback or code, and more work needs to be done. What magics would you need in your 3rd-party kernel, that can be accomplished this way? Will this design be sufficient? </div>


<div><br></div><div>We hope that this is useful!</div><div><br></div><div>-Doug</div><div><br></div>[1] - <a href="http://ipython.org/ipython-doc/dev/development/wrapperkernels.html" target="_blank">http://ipython.org/ipython-doc/dev/development/wrapperkernels.html</a><div>


[2] - <a href="https://bitbucket.org/ipre/calico/src/master/src/calico/" target="_blank">https://bitbucket.org/ipre/calico/src/master/src/calico/</a></div><div>[3] - <a href="https://bitbucket.org/ipre/calico/src/master/src/echo_kernel/echo_kernel.py" target="_blank">https://bitbucket.org/ipre/calico/src/master/src/echo_kernel/echo_kernel.py</a></div>


<div><br></div></div>
<br>_______________________________________________<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>
<br></blockquote></div><br></div>