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指针无效表示
我有一个使用 PyRun_SimpleFileEx
C API.
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指针无效表示