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

Привет. Самообучаюсь написанию модулей на C для Python по этому адресу https://docs.python.org/3/c-api/arg.html (скоро по работе может пригодиться).

Легко написал пример модуля с функцией add, которая суммирует два целых числа.

Как получить количество аргументов, переданных в функцию, чтобы она все их просуммировала и вернула результат? Что и как изменить в коде?

mymod.c:

#include <Python.h>
 
static PyObject *
mymod_add(PyObject *self, PyObject *args)
{
    int a = 0, b = 0;
    PyArg_ParseTuple(args, "i|i", &a, &b);
    return Py_BuildValue("i", a + b);
}
 
static PyMethodDef mymod_methods[] = {
    {"add",  mymod_add, METH_VARARGS, "The method adds two ints."},
    {NULL, NULL, 0, NULL}
};
 
static struct PyModuleDef mymod_definition = {
    PyModuleDef_HEAD_INIT,
    "mymod",
    "My test Python module.",
    -1,
    mymod_methods
};
 
PyMODINIT_FUNC PyInit_mymod(void)
{
    Py_Initialize();
    return PyModule_Create(&mymod_definition);
}

test.py:

import sys
sys.path.append('.')
import mymod
print(mymod.add(1, 2))
print(mymod.add(1))

Makefile (на всякий случай):

all: mymod.so
 
mymod.so: mymod.c Makefile
    gcc -shared -fPIC -o mymod.so mymod.c `python3-config --includes --libs --cflags --ldflags`
 
clean:
    -rm mymod.so

Кроме прочего, меня смущает, что когда не передаешь второй аргумент, функция PyArg_ParseTuple все равно его поганит непонятно чем, хотя он изначально 0. Как с этим бороться?

Упс, PyArg_ParseTuple перестала поганить второй аргумент. Наверное, забыл сделать make перед запуском test.py. Но это не снимает основного вопроса.


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