我在应该引发异常的子流程中执行代码。

当子进程返回异常时(最好在保留堆栈跟踪的同时),我想在主进程中引发相同的异常,但是我不确定如何执行此操作。

我很好地从子进程中捕获了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 ,它公开了一个高级界面来帮助您在多个进程中运行python代码。

假设您在main上具有定义明确的example.py函数:

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/

10-14 18:31