IPython:修改自定义包装器内核中的单元格

时间:2016-05-21 22:03:36

标签: python ipython jupyter jupyter-notebook

我是创建自定义包装器笔记本的新手,我正在尝试从自定义内核定义中创建/替换单元格内容。我的用例是我不能使用自定义魔法(来自我在网上看到的)和包装笔记本,所以我想在我的内核的do_execute方法中为此创建自己的解决方法。

我发现你可以在IPython Python笔记本中使用这样的东西来编辑/创建一个单元格:

from IPython import get_ipython
ip = get_ipython()
ip.set_next_cell('Test')

当我尝试在我的内核类的do_execute定义中包含它时,当我尝试在我的活动笔记本内核中运行一个单元格时出现以下错误:

[IPKernelApp] ERROR | Exception in message handler:
Traceback (most recent call last):
  File "C:\Users\Zach\Anaconda\lib\site-packages\ipykernel\kernelbase.py", line 212, in dispatch_shell
    handler(stream, idents, msg)
  File "C:\Users\Zach\Anaconda\lib\site-packages\ipykernel\kernelbase.py", line 370, in execute_request
    user_expressions, allow_stdin)
  File "C:\Users\Zach\Desktop\Dropbox\idl_code\echokernel.py", line 16, in do_execute
    ip.set_next_input('test string!')
AttributeError: 'NoneType' object has no attribute 'set_next_input'

我的问题是: 有没有人知道你可以修改自定义包装器笔记本定义中的单元格的简单方法?

我一直在寻找不同地方的网络,但未能找到一个清晰,简单的例子来说明如何做到这一点。这是我正在使用的内核代码,我从here获得并修改了一下:

from ipykernel.kernelbase import Kernel
from IPython import get_ipython

class EchoKernel(Kernel):
    implementation = 'Echo'
    implementation_version = '1.0'
    language = 'no-op'
    language_version = '0.1'
    language_info = {'mimetype': 'text/plain'}
    banner = "Echo kernel - as useful as a parrot"

    def do_execute(self, code, silent, store_history=True, user_expressions=None,
                   allow_stdin=False):

        ip = get_ipython()
        ip.set_next_input('test string!')

        if not silent:
            stream_content = {'name': 'stdout', 'text': code}
            self.send_response(self.iopub_socket, 'stream', stream_content)

        return {'status': 'ok',
                # The base class increments the execution count
                'execution_count': self.execution_count,
                'payload': [],
                'user_expressions': {},
               }

if __name__ == '__main__':
    from ipykernel.kernelapp import IPKernelApp
    IPKernelApp.launch_instance(kernel_class=EchoKernel)

这也是我的内核JSON定义:

{"argv":["python","-m","echokernel", "-f", "{connection_file}"],
 "display_name":"Echo"
}

0 个答案:

没有答案