在进程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返回相同的错误直到另一个错误发生,因此没有其他方法可以查看是否发生错误。如果有人有更好的方法,我想听听它。