重要
本文档涵盖 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 共享
一个内核进程可以同时连接到多个前端。在这种情况下,不同的前端将能够访问相同的变量。
此设计旨在允许轻松开发基于同一内核的不同前端,但它也使在同一前端中支持新语言成为可能,方法是在这些语言中开发内核,并且我们正在改进 IPython 以使其更实用。
如今,有两种方法可以为另一种语言开发内核。包装器内核重复使用 IPython 中的通信机制,并且仅实现核心执行部分。本机内核在目标语言中实现执行和通信
对于具有良好 Python 包装器的语言(如 octave_kernel)或不适合实现通信机制的语言(如 bash_kernel),包装器内核更容易快速编写。本机内核很可能由使用它们的社区更好地维护,例如 IJulia 或 IHaskell。