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
。 它用两个整数参数1
和2
调用它。 如果你想通过一个元组,你会做:
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代码。