繁体   English   中英

使用ctypes的c ++ python

[英]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 它使用两个整数参数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代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM