如果你想从另一个Python程序中运行内核代码,最简单的方法是连接一个
BlockingKernelManager。目前最好的例子是Paul Ivanov的
vim-ipython客户端或IPython自己的
terminal client。
要点如下:
- ipython内核会写JSON连接文件,位于
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
,其中包含各种客户端连接和执行代码所需的信息。
- KernelManagers是用于与内核通信(执行代码、接收结果等)的对象。
一个可工作的示例:
在shell中执行
ipython kernel
(或者
ipython qtconsole
,如果你想共享一个已经运行的GUI的内核)。
$> ipython kernel
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing kernel-6759.json
这里写了一个名为'kernel-6759.json'的文件。
然后,您可以运行此Python代码片段连接KernelManager并运行一些代码:
from IPython.lib.kernel import find_connection_file
from IPython.zmq.blockingkernelmanager import BlockingKernelManager
cf = find_connection_file('6759')
km = BlockingKernelManager(connection_file=cf)
km.load_connection_file()
km.start_channels()
def run_cell(km, code):
shell = km.shell_channel
print
print "running:"
print code
msg_id = shell.execute(code)
reply = shell.get_msg()
status = reply['content']['status']
if status == 'ok':
print 'succeeded!'
elif status == 'error':
print 'failed!'
for line in reply['content']['traceback']:
print line
run_cell(km, 'a=5')
run_cell(km, 'b=0')
run_cell(km, 'c=a/b')
一次运行的输出:
running:
a=5
succeeded!
running:
b=0
succeeded!
running:
c=a/b
failed!
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/Users/minrk/<ipython-input-11-fb3f79bd285b> in <module>()
----> 1 c=a/b
ZeroDivisionError: integer division or modulo by zero
查看message spec以获取有关如何解释答复的更多信息。如果相关,则标准输出/错误和显示数据将通过km.iopub_channel
传输,并且您可以使用由shell.execute()
返回的msg_id将输出与给定执行相关联。
附注:对于这些新功能的文档质量,我深表歉意。我们需要写很多东西。