C++/嵌入式 Python:当从 Python 调用 C++ 函数时,我可以检索 Python 文件名和行号吗
C++/embedded Python: Can I retrieve Python file name and line number when a C++ function is called from Python
我 运行 使用 PyRun_SimpleFile
来自 C++ 程序的 Python 脚本。我定义了一个自定义模块(使用 PyImport_AppendInittab
、as done here),因此它可以导入到我的 Python 脚本中,并且当函数来自使用此模块,这是通过 Python 解释器调用的回调 PyObject* MyFunction(PyObject *self, PyObject *args)
完成的。
我想知道正在调用的回调函数中的当前脚本文件名和行号。
我找不到任何方法来检索它。这可能吗?
注意:此问题绝对不是 How to get the caller's method name in the called method? 的重复问题。我正在尝试从 C++ 代码中检索文件名和行号,然后由 Python 脚本执行。
您将需要 PyTraceBack_Here
.
您可以看一下回溯对象的实现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"));
我 运行 使用 PyRun_SimpleFile
来自 C++ 程序的 Python 脚本。我定义了一个自定义模块(使用 PyImport_AppendInittab
、as done here),因此它可以导入到我的 Python 脚本中,并且当函数来自使用此模块,这是通过 Python 解释器调用的回调 PyObject* MyFunction(PyObject *self, PyObject *args)
完成的。
我想知道正在调用的回调函数中的当前脚本文件名和行号。
我找不到任何方法来检索它。这可能吗?
注意:此问题绝对不是 How to get the caller's method name in the called method? 的重复问题。我正在尝试从 C++ 代码中检索文件名和行号,然后由 Python 脚本执行。
您将需要 PyTraceBack_Here
.
您可以看一下回溯对象的实现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"));