Python ctypes将每个错误都转换为;free():无效指针";

Python ctypes将每个错误都转换为;free():无效指针";,python,error-handling,shared-libraries,wrapper,ctypes,Python,Error Handling,Shared Libraries,Wrapper,Ctypes,开发环境: Python 3.6 Ubuntu 18.04.3 LTS 我目前正在使用ctypes为共享库编写python包装器。 共享库是用C++编写的,已经有一个C包装: #ifdef __cplusplus extern "C" { #endif //__cplusplus #define UOM_EXPORT __attribute__((visibility("default"))) UOM_EXPORT MyModelInterface *createMyModel() {

开发环境:
Python 3.6
Ubuntu 18.04.3 LTS

我目前正在使用ctypes为共享库编写python包装器。 共享库是用C++编写的,已经有一个C包装:

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
#define UOM_EXPORT __attribute__((visibility("default")))

UOM_EXPORT MyModelInterface *createMyModel() {
    return new MyModel();
}

UOM_EXPORT int C_setOption(MyModelInterface *m, const char *option, const char *value) {
  if (m == NULL) {
    return -1;
  }
  m->setOption(option, value);
  return 0;
}

UOM_EXPORT int C_initializeModel(MyModelInterface *m, const char *inputFilename, float a1, float a2) {
  if (m == NULL) {
    return -1;
  }
  std::string input(inputFilename);
  m->initializeModel(input, a1, a2);
  return 0;
}

UOM_EXPORT int destroyMyModel(MyModelInterface *m) {
  if (m == NULL) {
    return -1;
  }
  delete reinterpret_cast <MyModel *>(m);
  return 0;
}

#ifdef __cplusplus
}
#endif //__cplusplus
它应该被称为:

libraryPath = "./libmymodel.so"
filename = "./test.png"
options = {"opt1":"val1","opt2":"val2"}
model = MyModel(libraryPath)
model.setOptions(options)
model.initializeModel(filename,1.0,2.0)
# ... more code
该代码目前有效。但每当我犯任何错误,比如打字:

def setOptions(self,optDict):
    for strOpt,strValue in optDict: # optDict instead of optDict.items()
        self.setOption(strOpt,strValue)
我得到了一般错误:

free(): invalid pointer
Aborted (core dumped)
而不是针对字典错误执行以下特定操作:

Traceback (most recent call last):
  File "MyModel.py", line 102, in <module>
    model.setOptions(options)
  File "MyModel.py", line 64, in setOptions
    for strOpt,strValue in optDict:
ValueError: too many values to unpack (expected 2)
当使用我自己的共享库作为
mylib
时,会出现free():无效指针消息。如果我设置了
mylib='libc.so.6'
,它会正确地打印回溯


EDIT2:将预期的回溯更改为对给定示例更现实。

这很难相信(使用您发布的代码)。事实上,您的代码由段组成,其中没有一个是最小的示例(甚至不是编辑中的示例)。另外,异常发生在哪里(哪一行代码)?添加完整的回溯。我能想到的是,在lib中的某个地方有一些免费调用,这些调用会被调用(但代码没有显示出来)。@CristiFati感谢您阅读这个问题。正如我所说的,我的问题是我没有从python获得回溯,即使错误在我的python代码中。我引用的回溯是一个被迫的例子。当我的python代码正确时,整个程序就会完美地执行。但是当我输入错误时,例如,
optDict
而不是
optDict.items()
,程序失败,只有输出
free():无效指针中止(内核转储)
,而不是回溯。如果它有任何进一步的帮助:我使用的共享库是使用TysFraseC++的API构建的,它天生就使用多线程。这可能是问题所在吗?您是否尝试过git gud?
Traceback (most recent call last):
  File "MyModel.py", line 102, in <module>
    model.setOptions(options)
  File "MyModel.py", line 64, in setOptions
    for strOpt,strValue in optDict:
ValueError: too many values to unpack (expected 2)
from ctypes import *

a = CDLL(mylib)
options = {"test1":1,"test2":2}

for a,b in options:
print(a,b)