C++调用Python如何处理SystemExit异常

C++ calling Python how to deal with SystemExit exception

我有一个使用 PyRun_SimpleFileEx C API.

执行 Python 脚本的 C++ 代码

py 文件看起来像这样

import time

time.sleep(2)
raise SystemExit("Sorry, it is time to exit.")

SystemExit 也是通过调用 python 之类的 quit()abort()

引发的

由于 SystemExit 继承自 BaseException 而不是 Exception,因此它不会被捕获并关闭 Python 环境以及 C++ 应用程序。

有什么方法可以从 C++ 中捕获上述异常吗?

提前致谢 祝一切顺利 MB

您可以创建一个 wrapper.py 并从中 运行 代码。

class ExceptionWrapper(Exception):
    def __init__(self, exc):
        self.exc = exc

def run_code(filename):
    try:
        exec(open(filename).read(), globals=globals(), locals=locals())
    except BaseException as ex:
        raise ExceptionWrapper(ex)

从 C++ 使用这个包装器:

#include <Python.h>

int main() {
    Py_Initialize();
    PyObject * wrapper = PyImport_ImportModule("wrapper");
    if (!wrapper) {
        PyErr_Print();
        exit(1);
    }
    PyObject * res = PyObject_CallMethod(wrapper, "run_code", "s", "simple.py");
    if (!res) {
        PyErr_Print();
        // PyObject *type, *value, *traceback;
        // PyErr_Fetch(&type, &value, &traceback);
        // PyErr_NormalizeException(&type, &value, &traceback);
        // or handle exception manually here
        // PyErr_Restore(type, value, traceback);
    }
    Py_XDECREF(res);
    printf("exit from C\n");
}

请注意,这只是一个 POC,运行 任意代码并不安全。

您可以修改包装器以接受文件描述符作为参数。

也许它会对其他人有用:

使用 PyRun_File* C API 系列使外部 C++ 应用程序保持原样(无 shut-off)。

脚本会失败,函数返回的PyObject指针无效表示