SystemError: <built-in function func_math> returned a result with an error set

386
17 июля 2017, 16:09

Хочу связать си\с++ код с кодом 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. Проект выложен на гит тут.

Answer 1

Сделали кортеж на 4 елемента, а заполнили 3:

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));

P.S: Также добавьте через строку эту строку:

std::cout << "__LINE__:" << __LINE__ << " PyErr:" << PyErr_Print() << std::endl;
READ ALSO
Можно ли отследить событие вызова Skype и/или любого SIP-клиента?

Можно ли отследить событие вызова Skype и/или любого SIP-клиента?

Есть ли способ отследить событие звонка Skype из своего приложения?

248
Специализация шаблона функции

Специализация шаблона функции

Здравствуйте люди добрые! Решаю задачку по плюсам, суть такая, что не могу написать специализацию шаблона функции - компилятор ругаетсяСуть...

295
Проблема с TerminateThread

Проблема с TerminateThread

Создаю поток

230
Большие проблемы с загрузкой tmx-файлов

Большие проблемы с загрузкой tmx-файлов

ЗдравствуйтеНеобходимо загрузить и отрисовать карту в tmx-формате

325