如果你想在内核中运行另一个Python程序的代码,最简单的方法是连接一个阻塞内核管理器 https://github.com/ipython/ipython/blob/master/IPython/zmq/blockingkernelmanager.py。目前最好的例子是保罗·伊万诺夫(Paul Ivanov)vim-ipython https://github.com/ivanov/vim-ipython客户端,或者IPython自己的终端客户端 https://github.com/ipython/ipython/blob/master/IPython/frontend/terminal/console/interactiveshell.py.
要旨:
- ipython 内核写入 JSON 连接文件,在
IPYTHONDIR/profile_<name>/security/kernel-<id>.json
,其中包含各种客户端连接和执行代码所需的信息。
- KernelManager 是用于与内核通信(执行代码、接收结果等)的对象。
*
一个工作示例:
在外壳中,执行ipython kernel
(or 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
# this is a helper method for turning a fraction of a connection-file name
# into a full path. If you already know the full path, you can just use that
cf = find_connection_file('6759')
km = BlockingKernelManager(connection_file=cf)
# load connection info and init communication
km.load_connection_file()
km.start_channels()
def run_cell(km, code):
# now we can run code. This is done on the shell channel
shell = km.shell_channel
print
print "running:"
print code
# execution is immediate and async, returning a UUID
msg_id = shell.execute(code)
# get_msg can block for a reply
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
see the 消息规范 http://ipython.org/ipython-doc/dev/development/messaging.html有关如何解释回复的更多信息。如果相关,标准输出/错误和显示数据将会过来km.iopub_channel
,并且您可以使用返回的 msg_idshell.execute()
将输出与给定的执行关联起来。
PS:对于这些新功能的文档质量,我深表歉意。我们有很多写作要做。