在进程内 ipython 内核上连接、运行、显示、显示错误的方法是
import re, sys, time, os
from StringIO import StringIO
from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient
from IPython.kernel.inprocess.manager import InProcessKernelManager
from IPython.kernel.inprocess.ipkernel import InProcessKernel
from IPython.core.interactiveshell import InteractiveShell
from IPython.utils.io import capture_output
def decorated_run_code(fn):
def new_run_code(*args, **kwargs):
res = fn(*args, **kwargs)
setattr(args[0], "last_known_outflag", res)
return res
return new_run_code
InteractiveShell.run_code = decorated_run_code(InteractiveShell.run_code)
km = InProcessKernelManager()
km.start_kernel()
kc = BlockingInProcessKernelClient(kernel=km.kernel)
kc.start_channels()
kc.shell_channel.execute('%pylab inline')
kernel = InProcessKernel()
ip = kernel.shell.get_ipython()
with capture_output() as io:
ip.run_cell(fail)
print "res", io.stdout
etype, value, tb = kernel.shell._get_exc_info(None)
print kernel.shell.last_known_outflag
if kernel.shell.last_known_outflag: print (etype, "/", value, "/", tb)
我不得不装饰 run_code 以捕获其结果并将其设置为 self,因为 _get_exc_info 返回相同的错误,直到发生另一个错误,因此没有其他方法可以查看是否发生错误。如果有人有更好的方法,我想听听。