Python 从SWIG包装的C++;功能
如果我从Python调用SWIG包装的C/C++函数,是否可以获得当前的调用堆栈?我想要类似于Python 从SWIG包装的C++;功能,python,swig,callstack,traceback,python-extensions,Python,Swig,Callstack,Traceback,Python Extensions,如果我从Python调用SWIG包装的C/C++函数,是否可以获得当前的调用堆栈?我想要类似于'.join(traceback.format_stack())的结果,但我不想将它从Python传递到我的C/C++函数,因为我并不总是需要它。因此,如果我的C/C++方面发生了错误,我希望能够即时获取并打印它。我想出了以下解决方案,尽管我仍然更喜欢以更自然的方式获取相同的内容(如果有的话) // This is similar to the python code: // def GetScri
'.join(traceback.format_stack())
的结果,但我不想将它从Python传递到我的C/C++函数,因为我并不总是需要它。因此,如果我的C/C++方面发生了错误,我希望能够即时获取并打印它。我想出了以下解决方案,尽管我仍然更喜欢以更自然的方式获取相同的内容(如果有的话)
// This is similar to the python code:
// def GetScriptingLanguageCallStack():
// import traceback
// return ''.join(traceback.format_stack())
string GetScriptingLanguageCallStack() {
string result;
PyObject* module_name = PyString_FromString("traceback");
PyObject* pyth_module = PyImport_Import(module_name);
Py_DECREF(module_name);
if (pyth_module != nullptr) {
PyObject* pyth_func = PyObject_GetAttrString(pyth_module, "format_stack");
if (pyth_func != nullptr) {
if (PyCallable_Check(pyth_func)) {
PyObject* pyth_val = PyObject_CallFunctionObjArgs(pyth_func, 0);
if (pyth_val != nullptr) {
if (PyList_Check(pyth_val)) {
const int size = PyList_GET_SIZE(pyth_val);
for (int i = 0; i < size; ++i) {
PyObject* pyth_line = PyList_GET_ITEM(pyth_val, i);
result += PyString_AsString(pyth_line);
}
}
Py_DECREF(pyth_val);
}
}
Py_DECREF(pyth_func);
}
Py_DECREF(pyth_module);
}
return result;
}
//这与python代码类似:
//def GetScriptingLanguageCallStack():
//导入回溯
//返回“”。加入(traceback.format_stack())
字符串GetScriptingLanguageCallStack(){
字符串结果;
PyObject*module_name=PyString_FromString(“回溯”);
PyObject*pyth_module=PyImport_Import(模块名称);
Py_DECREF(模块名称);
if(pyth_模块!=nullptr){
PyObject*pyth_func=PyObject_GetAttrString(pyth_模块,“格式_堆栈”);
if(pyth_func!=nullptr){
if(可调用校验(pyth函数)){
PyObject*pyth_val=PyObject_CallFunctionObjArgs(pyth_func,0);
如果(pyth_val!=nullptr){
如果(PyList_检查(pyth_val)){
const int size=PyList_GET_size(pyth_val);
对于(int i=0;i
顺便说一句,我不喜欢linked post中使用frame对象的方法,因为给出的行号不是指向进行进一步函数调用的确切行,而是只指向包含函数名的行