python与c ++使用ctypes

由于我还是新手,我遇到了一些问题,这是我的C ++代码:

#include  #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT PyObject *Add(PyObject *pSelf, PyObject *pArgs) { int s,d; if(!PyArg_ParseTuple(pArgs, "ii" , &s, &d)) { PyErr_SetString(PyExc_TypeError, "Add() invalid parameter"); return NULL; } return Py_BuildValue("i", s + d); } 

和Python代码:

 import ctypes MyDll = ctypes.cdll.LoadLibrary(r"PyToCppTest.dll") jj = MyDll.Add(1,2) 

运行上面的Python代码时出错:

OSError:exception:访问冲突读取0x000000000000000A

我希望将数据从Python转换为C ++,然后将其转换为C ++。

您的代码有一些问题。 首先,适当的包括:

 #include  

注意大写P 您可能在Windows上,但如果没有首都P,这将无法在Linux上运行。

另外,我没有在函数声明中看到*pSelf指针的意义,你应该摆脱它:

 PyObject *Add(PyObject *pArgs) 

现在,你的主要问题是:

 MyDll.Add(1,2) 

…不会使用元组调用MyDll.Add 。 它用两个整数参数12调用它。 如果你想通过一个元组,你会做:

 MyDll.Add((1,2)) 

但是,Python的ctypes不知道该怎么做(它通常接受整数参数),所以你需要告诉它Add实际上想要一个元组,并返回一个Python对象:

 import ctypes MyDll = ctypes.cdll.LoadLibrary("PyToCppTest.dll") MyCFunc = ctypes.PYFUNCTYPE( ctypes.py_object, # return val: a python object ctypes.py_object # argument 1: a tuple ) MyFunc = MyCFunc(('Add', MyDll)) jj = MyFunc((1,2)) 

使用扩展名或ctypes ; 你不应该通过ctypes调用你的扩展。 扩展的关键是能够创建对于使用Python的人来说看起来原生的模块。 ctypes用于调用完全没有Python编写的C代码。