我使用,从C ++程序运行Python脚本PyRun_SimpleFile
。我定义了一个自定义模块(使用PyImport_AppendInittab
,如此处完成),因此可以将其导入我的Python脚本中,并且使用该模块中的函数时,Python脚本会执行一些C ++代码,这是PyObject* MyFunction(PyObject *self, PyObject *args)
通过Python调用的回调来完成的口译员。
我想知道正在调用的回调函数中的当前脚本文件名和行号。
我找不到任何方法来检索此。这可能吗?
注意:此问题绝对不是如何在被调用方法中获取调用方的方法名称的重复项?。我正在尝试从正在执行的C ++代码中检索文件名和行号,然后再由Python脚本执行。
您将需要PyTraceBack_Here
。
您可以在此处查看回溯对象的实现
这是一个示例printig由以下人员创建的回溯 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"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句