[英]python with c++ using ctypes
由于我仍然很陌生,因此我遇到了一些问题,这是我的C ++代码:
#include <python.h>
#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:异常:读取访问冲突0x000000000000000A
我想不经转换就将数据从Python传递到C ++,然后在C ++中进行转换。
您的代码有些错误。 首先,适当的包括:
#include <Python.h>
注意大写P
您可能在Windows上,但是如果没有大写字母P,这将无法在Linux上使用。
另外,我在函数声明*pSelf
不到*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代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.