嵌入 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 qtconsole
或 ipython console
),而不是在终端中与之交互。
你甚至可以在使用 %run <filename>
在 IPython 交互提示符下运行代码时,运行嵌入的实例。由于在这种情况下很容易迷失当前所在的位置(是在顶层的 IPython 中还是在嵌入的 IPython 中),因此为嵌入的实例设置不同的 in/out
提示符是个好主意。下面的代码示例说明了这一点。
你还可以在程序中拥有多个 IPython 实例,并分别打开它们,例如使用不同的选项来展示数据。如果你多次关闭并重新打开同一个实例,它的提示计数器将简单地从一次执行延续到下一次。
请查看 embed
模块中的文档字符串,以获取有关此系统使用的更多详细信息。