C++/嵌入式Python:当从Python调用C++函数时,我可以检索Python文件名和行号吗



我使用PyRun_SimpleFile从C++程序运行Python脚本。我定义了一个自定义模块(使用PyImport_AppendInittab,如上所述(,因此它可以导入到我的Python脚本中,当使用该模块中的函数时,一些C++代码将由Python脚本执行,这是通过Python解释器调用的回调PyObject* MyFunction(PyObject *self, PyObject *args)来完成的。

我想知道当前调用的回调函数中的脚本文件名和行号。

我找不到任何方法来取回这个。这可能吗?

注意:这个问题绝对不是如何得到来电者的重复';s在被调用方法中的方法名称?。我正在尝试从C++代码中检索文件名和行号,这些代码稍后由Python脚本执行。

您将需要PyTraceBack_Here

您可以在这里查看回溯对象的实现

以下是打印PyTraceBack_Here创建的回溯的示例

#include <Python.h>
PyObject * mymodule_meth_test(PyObject * self) {
PyTraceBack_Here(PyEval_GetFrame());
PyObject * exc;
PyObject * val;
PyObject * tb;
PyErr_Fetch(&exc, &val, &tb);
PyTraceBack_Print(tb, PySys_GetObject("stderr"));
Py_RETURN_NONE;
}
PyMethodDef module_methods[] = {
{"test", (PyCFunction)mymodule_meth_test, METH_NOARGS, NULL},
{},
};
PyModuleDef module_def = {PyModuleDef_HEAD_INIT, "mymodule", NULL, -1, module_methods};
extern "C" PyObject * PyInit_mymodule() {
PyObject * module = PyModule_Create(&module_def);
return module;
}

tb对象中,您应该能够提取文件名和行号。它是一个普通的PyObject,您可以将它传递给python脚本或对其进行检查

以下是如何在不考虑引用计数的情况下提取值:

int line = PyLong_AsLong(PyObject_GetAttrString(PyObject_GetAttrString(tb, "tb_frame"), "f_lineno"));
const char * filename = PyUnicode_AsUTF8(PyObject_GetAttrString(PyObject_GetAttrString(PyObject_GetAttrString(tb, "tb_frame"), "f_code"), "co_filename"));

最新更新