我正在尝试从multiprocessing.Process中获取一个traceback对象。不幸的是,通过管道传递异常信息并不起作用,因为无法pickle traceback对象:
def foo(pipe_to_parent):
try:
raise Exception('xxx')
except:
pipe_to_parent.send(sys.exc_info())
to_child, to_self = multiprocessing.Pipe()
process = multiprocessing.Process(target = foo, args = (to_self,))
process.start()
exc_info = to_child.recv()
process.join()
print traceback.format_exception(*exc_info)
to_child.close()
to_self.close()
跟踪:
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
self.run()
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "foo", line 7, in foo
to_parent.send(sys.exc_info())
PicklingError: Can't pickle <type 'traceback'>: attribute lookup __builtin__.traceback failed
有没有其他方法可以访问异常信息?我想避免传递格式化的字符串。
DelayedException
的示例。 - ForeverWintrtblib.pickling_support.install()
必须在ExceptionWrapper
声明之后调用,或作为类定义的装饰器。https://github.com/ionelmc/python-tblib#pickling-tracebacks - Arseniy Banayev