python - 从子流程中重新引发异常

标签 python python-2.7 exception subprocess

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

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

我很好地从子进程中捕获了 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/

相关文章:

python - 额外数据: line 2 column 1 - line 341211 -- Error in json.加载

vb.net - 集合被修改;枚举操作可能无法执行 #10897

VSCODE : how to ignore exceptions 中的 PHP 7 Xdebug

java - 如何使用 javac 1.7 而不是 1.6?

python - 在 Azure DevOps Git 存储库中使用来自 Azure Pipelines 的 Python 包版本标记 Git 存储库

python - 无法使用 OpenShift 安装 Pandas

python - 在 Python 中管理 Selenium 的多个实例

python - 为什么 os.lseek() 在类文件对象上比 seek() 慢?

javascript - Bokeh 数据库绘图和更新

python - Errno None 无法为具有大量请求的 <my_url> 写入请求正文