0
0 комментариев

Хочу связать си\с++ код с кодом python. Для этого сделал решение в котором 2 проекта: 1 на плюсах, 1 на питоне.
В плюсах есть 2 ф-ции (mySumm(), func_math()):

typedef struct
{
    double x, y, z;
} point3;
point3 L = { 1.21, 2.321, 3.321123 };
 
point3 func_math(
    double P,
    double R,
    double Q,
    uint16_t last_ray,
    double f[4],
    point3 L)
{
    point3 W;
    W.x = P + R + Q;
    W.y = L.x + L.y + L.z;
    W.z = (f[0] + f[1] + f[2] + f[3]) * last_ray;
    return W;
}
int mySumm(long a, long b)
{
    return a + b;
}
И код который [преобразует проекта C++ в расширение для Python][1]:
/*  func_math */
PyObject* func_math_py(PyObject *, PyObject* o) {
    double P, R, Q;
    unsigned long n_ray;
    double Fd[4];
    Q = PyFloat_AsDouble(PyList_GetItem(o, 0));
    P = PyFloat_AsDouble(PyList_GetItem(o, 1));
    R = PyFloat_AsDouble(PyList_GetItem(o, 2));
    n_ray = PyLong_AsUnsignedLong(PyList_GetItem(o, 3));
    Fd[0] = PyFloat_AsDouble(PyList_GetItem(o, 4));
    Fd[1] = PyFloat_AsDouble(PyList_GetItem(o, 5));
    Fd[2] = PyFloat_AsDouble(PyList_GetItem(o, 6));
    Fd[3] = PyFloat_AsDouble(PyList_GetItem(o, 7));
    point3 W = func_math(P, R, Q, n_ray, Fd, L);
    PyObject *t;
    t = PyTuple_New(4);
    PyTuple_SetItem(t, 0, PyFloat_FromDouble(W.x));
    PyTuple_SetItem(t, 1, PyFloat_FromDouble(W.z));
    PyTuple_SetItem(t, 2, PyFloat_FromDouble(W.y));
    return t;
}
 
PyObject* mySumm_py(PyObject *, PyObject* o) {
    return PyLong_FromLong(mySumm(PyLong_AsLong(PyList_GetItem(o, 0)),
        PyLong_AsLong(PyList_GetItem(o, 1))));
}
 
static PyMethodDef mysummmodule_methods[] = {
    // The first property is the name exposed to python, the second is the C++ function name
    { "mySumm", (PyCFunction)mySumm_py, METH_O, nullptr },
    { "func_math", (PyCFunction)func_math_py, METH_O, nullptr },
    // Terminate the array with an object containing nulls.
    { nullptr, nullptr, 0, nullptr }
};
 
static PyModuleDef mysummmodule_module = {
    PyModuleDef_HEAD_INIT,
    "mysummmodule",                        // Module name
    "Test func. mySumm(long a, long b)",  // Module description
    0,
    mysummmodule_methods                   // Structure that defines the methods
};
 
PyMODINIT_FUNC PyInit_mysummmodule() {
    return PyModule_Create(&mysummmodule_module);
}

В проекте на питоне написан следующий код:

import mysummmodule as m
 
print('m.mySumm([2,3]) = {}'.format(m.mySumm([2,3])))
print(help(m))
print('m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7]) = {}'.format(
    m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7])))

Консоль выводит это:

m.mySumm([2,3]) = 5
Help on module mysummmodule:
 
NAME
    mysummmodule - Test func. mySumm(long a, long b)
 
FUNCTIONS
    func_math(...)
 
    mySumm(...)
 
FILE
    c:\users\q\documents\visual studio 2017\projects\testpy_cpp\x64\release\mysummmodule.pyd
 
 
None
TypeError: bad argument type for built-in operation
 
The above exception was the direct cause of the following exception:
 
Traceback (most recent call last):
  File "C:\Users\q\documents\visual studio 2017\Projects\testPy_CPP\Py\Py.py", line 5, in <module>
    print('m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7]) = {}'.format(m.func_math([1.1, 2.2, 3.3, 4, 5.5, -6.6, -7.7])))
SystemError: <built-in function func_math> returned a result with an error set

То есть: ф-ция mySumm — работает корректно.
Ф-ция func_math — выдает ошибку.
Не знаю, откуда берется ошибка, и как ее исправить. Работаю в VS2017 Prewiew. Проект выложен на гит тут.


Добавить комментарий