Python с C ++ с использованием 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 ++.

1

Решение

Есть несколько вещей, которые не так с вашим кодом. Прежде всего, правильное включает в себя:

#include <Python.h>

Обратите внимание на столицу P, Вы, вероятно, на Windows, но это не будет работать на Linux без заглавной буквы P.

Кроме того, я не вижу смысла *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))
3

Другие решения

Используйте расширение или ctypes; Вы не должны вызывать свой номер через ctypes, Смысл расширений в том, чтобы иметь возможность создавать модули, которые выглядят нативно для людей, использующих их из Python. ctypes служит для вызова кода на C, который был написан полностью без внимания Python.

3