Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从SWIG包装的C++;功能_Python_Swig_Callstack_Traceback_Python Extensions - Fatal编程技术网

Python 从SWIG包装的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

如果我从Python调用SWIG包装的C/C++函数,是否可以获得当前的调用堆栈?我想要类似于
'.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对象的方法,因为给出的行号不是指向进行进一步函数调用的确切行,而是只指向包含函数名的行