我在应该引发异常的子进程中执行代码。
当从子进程返回异常时(最好同时保留堆栈跟踪),我想在主进程中引发相同的异常,但我不确定如何执行此操作。
我很好地从子进程中捕获了 stderr,但我找不到如何解析它,所以我得到了异常类型。我将如何做到这一点?
我正在使用 python 2.7
主要方法
import subprocess
example=subprocess.Popen(["python","example.py"],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
return_obj, return_error = example.communicate()
if return_error:
# replace with error from subprocess
print "Should raise ",NameError('HiThere')
raise TypeError('Wrong type')
子进程
raise NameError('HiThere')
最佳答案
如果您只想在单独的进程中运行您的 python 代码,您可能不应该使用 subprocess
。正如 Serge Ballesta 所说,subprocess
的目的是在操作系统级别运行不同的程序,而不特别关心它是什么 - 没有什么可以帮助您正确处理 python 解释器进程的复杂性。
对于这种目的,最好的方法可能是简单地import
您的代码并使用multiprocessing
。 ,它公开了一个高级接口(interface)来帮助您在多个进程中运行 python 代码。
假设您在 example.py
上有一个定义良好的 main
函数:
from examply import main as example_main
import multiprocessing
pool= multiprocessing.Pool(1)
pool.apply( example_main )
使用此代码,异常和返回值都将透明地提供给您的主进程。
如果您不想阻塞等待结果,您也可以使用 Pool.apply_async
。
关于python - 从子流程中重新引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177249/