Поскольку я все еще новичок в этом, я столкнулся с некоторыми проблемами, вот мой код 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, но это не будет работать на 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))
Используйте расширение или ctypes
; Вы не должны вызывать свой номер через ctypes
, Смысл расширений в том, чтобы иметь возможность создавать модули, которые выглядят нативно для людей, использующих их из Python. ctypes
служит для вызова кода на C, который был написан полностью без внимания Python.