我想访问在子进程中运行的python程序的回溯。
在新程序开始执行之前,子进程中引发的异常将在父进程中重新引发。此外,异常对象将有一个名为child_traceback的额外属性,该属性是一个字符串,包含来自子视点的回溯信息。
my_sub_program.py
的内容:
raise Exception("I am raised!")
my_main_program.py
的内容:
import sys
import subprocess
try:
subprocess.check_output([sys.executable, "my_sub_program.py"])
except Exception as e:
print e.child_traceback
如果我运行my_main_program.py
,则会收到以下错误:
Traceback (most recent call last):
File "my_main_program.py", line 6, in <module>
print e.child_traceback
AttributeError: 'CalledProcessError' object has no attribute 'child_traceback'
如何在不修改子进程程序代码的情况下访问子进程的回溯?这意味着,我想避免在我的整个子程序代码中添加一个大的try/except
子句,而是处理来自我的主程序的错误记录。
编辑: sys.executable
应该可以使用与运行主程序的解释程序不同的解释程序替换。
答案 0 :(得分:0)
当你开始另一个Python进程时,你也可以尝试使用multiprocessing
Python模块;通过对Process
类进行子类化,可以很容易地从目标函数中获取异常:
from multiprocessing import Process, Pipe
import traceback
import functools
class MyProcess(Process):
def __init__(self, *args, **kwargs):
Process.__init__(self, *args, **kwargs)
self._pconn, self._cconn = Pipe()
self._exception = None
def run(self):
try:
Process.run(self)
self._cconn.send(None)
except Exception as e:
tb = traceback.format_exc()
self._cconn.send((e, tb))
# raise e # You can still rise this exception if you need to
@property
def exception(self):
if self._pconn.poll():
self._exception = self._pconn.recv()
return self._exception
p = MyProcess(target=functools.partial(execfile, "my_sub_program.py"))
p.start()
p.join() #wait for sub-process to end
if p.exception:
error, traceback = p.exception
print 'you got', traceback
诀窍是让目标函数执行Python子程序,这是通过使用functools.partial
完成的。