[英]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.