如何防止嵌入python退出()我的进程



我在运行嵌入式python时遇到麻烦。事实证明,我无法捕获由sys.exit();

引发的SystemExit异常

这是我目前为止写的:

$ cat call.c 
#include <Python.h>
int main(int argc, char *argv[])
{
    Py_InitializeEx(0);
    PySys_SetArgv(argc-1, argv+1);
    if (PyRun_AnyFileEx(fopen(argv[1], "r"), argv[1], 1) != 0) {
        PyObject *exc = PyErr_Occurred();
        printf("terminated by %sn",
                PyErr_GivenExceptionMatches(exc, PyExc_SystemExit) ?
                "exit()" : "exception");
    }
    Py_Finalize();
    return 0;
}

另外,我的脚本是:

$ cat unittest-files/python-return-code.py 
from sys import exit
exit(99)
运行:

$ ./call unittest-files/python-return-code.py 
$ echo $?
99

必须执行一个文件,而不是一个命令。

PyRun_SimpleFileExFlags函数(以及使用它的所有函数,包括PyRun_AnyFileEx)通过退出SystemExit或打印回溯来处理异常。使用PyRun_File*系列函数来处理周围代码中的异常

根据Denis的回答,我编写了以下代码片段:

PyObject* main_module = PyImport_AddModule("__main__");
if (!main_module) {
    PyErr_Print();
    // Failure
} else {
    Py_INCREF(main_module);
    PyObject *pdict = PyModule_GetDict(main_module);
    if (PyRun_File(file, file_name, Py_file_input, pdict, pdict) != NULL) {
        // Success
    } else {
        Py_CLEAR(main_module);
        PyObject *exception_type = PyErr_Occurred();
        if (!PyErr_GivenExceptionMatches(exception_type, PyExc_SystemExit)) {
            PyErr_Print();
            // Failure
        } else {
            PyObject *type;
            PyObject *value;
            PyObject *traceback;
            PyErr_Fetch(&type, &value, &traceback);
            long exit_code = PyLong_AsLong(value);
            std::cout << exit_code << std::endl;
                    
            if (exit_code == 0) {
                // Success
            } else {
                // Failure: sys.exit() with non-zero code
            }
            Py_XDECREF(type);
            Py_XDECREF(value);
            Py_XDECREF(traceback);
        }
    }
    Py_XDECREF(main_module);
}

相关内容

  • 没有找到相关文章

最新更新