簡體   English   中英

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如此處完成),因此它可以導入到我的 Python 腳本中,並且當使用該模塊中的函數時,Python 腳本會執行一些 C++ 代碼,這是通過回調PyObject* MyFunction(PyObject *self, PyObject *args)被 Python 解釋器調用。

我想知道正在調用的回調函數中的當前腳本文件名和行號。

我找不到任何方法來檢索它。 這可能嗎?

注意:這個問題絕對不是How to get the caller's method name in the called method? . 我正在嘗試從執行並稍后由 Python 腳本執行的 C++ 代碼中檢索文件名和行號。

您將需要PyTraceBack_Here

您可以在此處查看回溯對象的實現

這是打印 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"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM