重要

本文档涵盖 IPython 6.0 及更高版本。从 6.0 版开始,IPython 不再支持与低于 3.3 的 Python 版本(包括所有版本的 Python 2.7)的兼容性。

如果您正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参阅其文档(LTS 是长期支持版本)。

制作简单的 Python 包装器内核

在 3.0 版中添加。

您现在可以在 IPython 中重新使用内核机制来轻松制作新的内核。这对于具有 Python 绑定的语言很有用,例如 Octave(通过 Oct2Py),或可以在 tty 中使用 pexpect 控制 REPL 的语言,例如 bash。

另请参见

bash_kernel

使用此机制编写的 bash 的简单内核

必需步骤

子类 ipykernel.kernelbase.Kernel,并实现以下方法和属性

class MyKernel
implementation
implementation_version
language
language_version
banner

有关 内核信息 回复的信息。“实现”指的是内核(例如 IPython),而“语言”指的是它解释的语言(例如 Python)。在第一个提示符之前,会向用户在控制台 UI 中显示“横幅”。所有这些值都是字符串。

language_info

有关 内核信息 回复的语言信息,以字典形式提供。其中应包含以下键:mimetype,其值为目标语言中代码的 MIME 类型(例如 'text/x-python'),以及 file_extension(例如 'py')。如果需要与 language 不同,其中还可能包含键 codemirror_modepygments_lexer

稍后可能向其中添加其他键。

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

执行用户代码。

参数:
  • code (str) – 要执行的代码。

  • silent (bool) – 是否显示输出。

  • store_history (bool) – 是否将此代码记录在历史记录中并增加执行计数。如果 silent 为 True,则此项隐式为 False。

  • user_expressions (dict) – 代码运行后要评估的名称到表达式的映射。如果您需要,可以忽略此项。

  • allow_stdin (bool) – 前端是否可以根据请求提供输入(例如,对于 Python 的 raw_input())。

您的方法应返回一个包含 执行结果 中所述字段的字典。要显示输出,它可以使用 send_response() 发送消息。有关不同消息类型的详细信息,请参阅 IPython 中的消息传递

要启动内核,请在模块末尾添加此内容

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

示例

echokernel.py 只会将给定的任何输入回显到 stdout

from ipykernel.kernelbase import Kernel

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):
        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)

以下是此 kernel.json 文件的内核规范

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

可选步骤

你可以覆盖许多其他方法来改善内核的功能。所有这些方法都应返回一个字典,如 消息传递规范 的相关部分中所述。

class MyBetterKernel
do_complete(code, cusor_pos)

代码完成

参数:
  • code (str) – 已存在的代码

  • cursor_pos (int) – 请求完成的代码中的位置

另请参见

完成 消息

do_inspect(code, cusor_pos, detail_level=0)

对象自省

参数:
  • code (str) – 代码

  • cursor_pos (int) – 请求自省的代码中的位置

  • detail_level (int) – 0 或 1 表示更多或更少的详细信息。在 IPython 中,1 获取源代码。

另请参见

自省 消息

do_history(hist_access_type, output, raw, session=None, start=None, stop=None, n=None, pattern=None, unique=False)

历史访问。只传递与所涉及的历史请求类型相关的相关参数,因此你的方法定义必须对此处显示的所有带有默认值的参数具有默认值。

另请参见

历史 消息

do_is_complete(code)

在类似控制台的界面中输入的代码是否完整且可以执行,还是应该显示继续提示符?

参数:

code (str) – 到目前为止输入的代码 - 可能有多行

另请参见

代码完整性 消息

do_shutdown(restart)

关闭内核。您只需要处理自己的清理工作 - 内核机制将负责在停止之前清理自己的内容。

参数:

restart (bool) – 之后是否重新启动内核

另请参见

内核关闭 消息