1

由于我还是新手,所以我遇到了一些问题,这是我的 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++ 中进行转换。

4

2 回答 2

3

您的代码有一些问题。首先,正确的包括是:

#include <Python.h>

注意大写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))
于 2013-02-27T18:41:41.450 回答
3

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

于 2013-02-27T18:42:02.613 回答