C ++ /嵌入式Python:从Python调用C ++函数时,能否检索Python文件名和行号

jpo38

我使用,从C ++程序运行Python脚本PyRun_SimpleFile我定义了一个自定义模块(使用PyImport_AppendInittab如此处完成),因此可以将其导入我的Python脚本中,并且使用该模块中的函数时,Python脚本会执行一些C ++代码,这是PyObject* MyFunction(PyObject *self, PyObject *args)通过Python调用的回调完成的口译员。

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

我找不到任何方法来检索此。这可能吗?

注意:此问题绝对不是如何在被调用方法中获取调用方的方法名称的重复项我正在尝试从正在执行的C ++代码中检索文件名和行号,然后再由Python脚本执行。

Szabolcs Dombi

您将需要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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用嵌入式列表的python队列

来自分类Dev

从C#调用带有嵌入式空格(``XXX YY'')的F#打勾函数名称

来自分类Dev

Boost python,嵌入式时从python调用c ++函数

来自分类Dev

嵌入式C和8051微控制器

来自分类Dev

调度嵌入式python进程

来自分类Dev

C ++嵌入Python

来自分类Dev

将嵌入式Python异常传播到C ++

来自分类Dev

在python中运行嵌入式mongodb

来自分类Dev

Python调试:获取调用函数的文件名和行号?

来自分类Dev

设置嵌入式Python以编写C ++游戏脚本

来自分类Dev

Python import_array使得无法使用ctrl-c杀死嵌入式python

来自分类Dev

C ++:未使用嵌入式模板调用析构函数

来自分类Dev

在嵌入式系统上混合使用C和C ++

来自分类Dev

通过嵌入式Python调用C ++代码

来自分类Dev

C ++中的嵌入式Python线程错误

来自分类Dev

C代码嵌入式python回调函数

来自分类Dev

Python嵌入式C代码编译错误

来自分类Dev

嵌入式世界中的C文件功能

来自分类Dev

如何使用C ++中的字节码优化来初始化嵌入式Python解释器?

来自分类Dev

在嵌入式Python C ++应用程序中导入Numpy

来自分类Dev

从C ++嵌入式解释器捕获python窗口输出

来自分类Dev

使用pybind11通过预先存在的嵌入式python解释器公开C ++功能

来自分类Dev

C ++ / Tcl调用Tcl_CreateCommand记录的函数时,能否检索Tcl文件行号

来自分类Dev

使用嵌入式列表的python队列

来自分类Dev

嵌入式C和8051微控制器

来自分类Dev

Python嵌入式Linux命令

来自分类Dev

C ++中的嵌入式Python线程错误

来自分类Dev

如何在嵌入式Python中动态添加C函数

来自分类Dev

用C++估算嵌入式python脚本的进度