重要

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

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

IPython 的工作原理

终端 IPython

当您键入 ipython 时,您将获得在终端中运行的原始 IPython 界面。它执行类似以下操作

while True:
    code = input(">>> ")
    exec(code)

当然,它要复杂得多,因为它必须处理多行代码、使用 readline 进行制表符补全、魔术命令等。但模型是这样的:提示用户输入一些代码,当他们输入后,在同一进程中执行它。此模型通常称为 REPL,即读取-求值-打印-循环。

IPython 内核

所有其他界面(笔记本、Qt 控制台、终端中的 ipython console 以及第三方界面)都使用 IPython 内核。这是一个独立的进程,负责运行用户代码以及计算可能的补全等事项。前端使用通过 ZeroMQ 套接字发送的 JSON 消息与其通信;它们使用的协议在 Jupyter 中的消息传递 中进行了描述。

内核的核心执行机制与终端 IPython 共享

../_images/ipy_kernel_and_terminal.png

一个内核进程可以同时连接到多个前端。在这种情况下,不同的前端将能够访问相同的变量。

此设计旨在允许轻松开发基于同一内核的不同前端,但它也使在同一前端中支持新语言成为可能,方法是在这些语言中开发内核,并且我们正在改进 IPython 以使其更实用。

如今,有两种方法可以为另一种语言开发内核。包装器内核重复使用 IPython 中的通信机制,并且仅实现核心执行部分。本机内核在目标语言中实现执行和通信

../_images/other_kernels.png

对于具有良好 Python 包装器的语言(如 octave_kernel)或不适合实现通信机制的语言(如 bash_kernel),包装器内核更容易快速编写。本机内核很可能由使用它们的社区更好地维护,例如 IJuliaIHaskell