python - C++/嵌入式 Python:当从 Python 调用 C++ 函数时,我可以检索 Python 文件名和行号吗
问题描述
我使用PyRun_SimpleFile
. 我定义了一个自定义模块(使用PyImport_AppendInittab
,如此处所做的),因此可以在我的 Python 脚本中导入它,并且当使用此模块中的函数时,Python 脚本会执行一些 C++ 代码,这是PyObject* MyFunction(PyObject *self, PyObject *args)
通过 Python 调用的回调来完成的口译员。
我想知道正在调用的回调函数中的当前脚本文件名和行号。
我找不到任何方法来检索它。这可能吗?
注意:这个问题绝对不是重复How to get the caller's method name in the called method? . 我正在尝试从执行的 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"));
推荐阅读
- axios - Axios - 发送带有 & 签名的 GET
- angular - 从 FormBuilder 传递对象的问题
- amazon-web-services - 如何在某个时间段内获取 lambda 的总调用时间
- objective-c - API_DEPRECATED 宏中的平台问题
- python - 从文本文件中删除标点符号和数字时出错
- c++ - 如何在 C++ 中打印多个输入和输出?
- android - 如何使用 Jetpack compose 实现交错网格布局?
- flutter - 如何在 Flutter 中设计这样的布局背景?
- javascript - 为什么我得到空白输入值?
- python - 在拥有分类数据时,使用 Sklearn 随机森林进行特征选择并没有给我预期的结果