嵌入 IPython

嵌入 IPython#

参考:embedding

你可以在程序的任何地方使用以下代码启动常规的 IPython 会话:

import IPython
IPython.start_ipython(argv=[])

这将加载 IPython 配置、启动文件等,就像它是一个正常的 IPython 会话一样。有关从 Python 运行 IPython 时设置配置选项的信息,请参阅从 Python 运行 IPython

还可以在 Python 代码的命名空间中嵌入 IPython shell。这使你能够动态评估代码的状态,操作变量,分析它们等。例如,如果你运行以下代码片段:

import IPython

a = 42
IPython.embed()

在 IPython shell 中,你可以将 a 重新赋值为 23,以进行进一步的某种测试,然后退出:

IPython.embed()
Python 3.6.2 (default, Jul 17 2017, 16:44:45)
Type 'copyright', 'credits' or 'license' for more信息
IPython 6.2.0.dev -- 增强的交互式 Python输入 '?' 获取帮助

In [1]: a = 23

In [2]: exit()

一旦你退出并打印 a,将显示值 23

In: print(a)
23

需要注意的是,在嵌入的 IPython shell 中运行的代码不会改变你的代码和变量的状态,除非该 shell 位于全局命名空间中。在上面的例子中,a 发生了变化,因为这是成立的。

为了进一步说明这一点,考虑以下示例:

import IPython
def do():
    a = 42
    print(a)
    IPython.embed()
    print(a)

现在,如果你调用该函数并像上面那样完成状态更改,将打印出值 42。再次强调,这是因为它不在全局命名空间中:

do()

运行包含上述代码的文件可能会导致以下会话:

do()
42
Python 3.6.2 (default, Jul 17 2017, 16:44:45)
Type 'copyright', 'credits' or 'license' for more信息
IPython 6.2.0.dev -- 增强的交互式 Python输入 '?' 获取帮助

In [1]: a = 23

In [2]: exit()
42

此功能允许你通过简单的函数调用,在代码的任何地方轻松拥有功能齐全的 Python 环境,用于对象内省。在某些情况下,简单的 print 语句就足够了,但如果你需要对代码片段进行更详细的分析,此功能将非常有价值。

在科学计算场景中,此功能也非常有用,因为在这些场景中,通常需要执行一些自动化的、计算密集型的部分,然后停下来查看数据、绘图等。打开 IPython 实例将使你能够完全访问你的数据和函数,并且一旦你完成了交互部分,你可以恢复程序的执行(可能稍后再次停止,根据需要多次进行)。

以下代码片段是你需要在 Python 程序中包含的最少代码,以便实现此功能(稍后将提供详细示例):

from IPython import embed

embed()  # 此调用可以在程序的任何地方启动 IPython

你还可以嵌入 IPython 内核,以便与 qtconsole 等工具一起使用,通过 IPython.embed_kernel() 实现。这种方式的工作原理相同,但你可以连接一个外部前端(如 ipython qtconsoleipython console),而不是在终端中与之交互。

你甚至可以在使用 %run <filename> 在 IPython 交互提示符下运行代码时,运行嵌入的实例。由于在这种情况下很容易迷失当前所在的位置(是在顶层的 IPython 中还是在嵌入的 IPython 中),因此为嵌入的实例设置不同的 in/out 提示符是个好主意。下面的代码示例说明了这一点。

你还可以在程序中拥有多个 IPython 实例,并分别打开它们,例如使用不同的选项来展示数据。如果你多次关闭并重新打开同一个实例,它的提示计数器将简单地从一次执行延续到下一次。

请查看 embed 模块中的文档字符串,以获取有关此系统使用的更多详细信息。