Python3.X использует расширения C для вызова C/C++

Python C++

1 Создайте файл кода C/C++

Предположим, мы хотим вызвать следующую реализацию языка C в коде PythonmulФункция умножает два целых числа, функцияaddДобавьте два целых числа, чтобы создатьdemo_module.c, код показывает, как показано ниже

// pulls in the Python API 
#include <Python.h>
static int mul(int a,int b){
    return a*b;
}
static int add(int a,int b){
    return a+b;
}
// C function always has two arguments, conventionally named self and args
// The args argument will be a pointer to a Python tuple object containing the arguments.
// Each item of the tuple corresponds to an argument in the call's argument list.
static PyObject* demo_mul_and_add(PyObject *self, PyObject *args)
{
    const int a, b;
    // convert PyObject to C values
    if (!PyArg_ParseTuple(args, "ii", &a, &b))
        return NULL;
    int c=mul(a,b);
    int d=add(c,c);
    // convert C value to PyObject
    return Py_BuildValue("i", d);
}

// module's method table
static   PyMethodDef DemoMethods[] = {
    {"mul_and_add", demo_mul_and_add, METH_VARARGS, "Mul and Add two integers"},
    {NULL, NULL, 0, NULL} 
};
static struct PyModuleDef demomodule = {
    PyModuleDef_HEAD_INIT,
    "demo", /* module name */
    NULL, /* module documentation, may be NULL */
    -1,
    DemoMethods /* the methods array */
};

PyMODINIT_FUNC PyInit_demo(void)
{
    return PyModule_Create(&demomodule);
}

1.1 Функция demo_mul_and_add

Среди них функцияdemo_mul_and_addЭто функция-мост между языком C и языком Python.demo_mul_and_addиспользовать внутреннюю функциюPyArg_ParseTupleФункция преобразует параметр типа Python в тип данных на языке C. где параметрыiiУказывает, что два последовательных данных int в Python преобразуются в int на языке C. Обычно используются следующие преобразования типов данных.

персонаж

Тип языка С

Python

c

char

Преобразование строки длины 1 в символ языка C

s

char array

Преобразование строки в массив символов языка C в Python

d

double

Преобразование Python float в double на языке C

f

float

Преобразование float в Python в float на языке C

i

int

Преобразование int в Python в int на языке C

l

long

Преобразовать int в Python в long на языке C

o

PyObject*

Преобразование объектов класса в Python в PyObject на языке C

И функцияPyArg_ParseTupleВместо этого функцияPy_BuildValueПреобразование типов данных на языке C в объекты Python, отношение сопоставления типов согласовано, см. несколько простых примеров ниже.

образец кода

Преобразовать в объект Python

Py_BuildValue("s", "AB")

"AB"

Py_BuildValue("i", 1000)

1000

Py_BuildValue("(iii)", 1, 2, 3)

(1, 2, 3)

Py_BuildValue("{si,si}", "a', 4, "b", 9)

{"a": 4, "b": 9}

Py_BuildValue("")

None

1.2 Свойства DemoMethods и demomodule

ОпределенныйPyMethodDefАтрибут типа DemoMethods используется для регистрации списка функций преобразования, т. е.demo_mul_and_addфункция, которая"mul_and_add"Используется для указания соответствующего имени функции при вызове функции в коде Python.

ОпределенныйPyModuleDefАтрибут demomodule типа используется для имени модуля и списка функций в нем.

1.3 PyMODINIT_FUNC

PyMODINIT_FUNC используется для указания функции ввода инициализации, а PyModule_Create используется для создания модуля.

2 Создатьsetup.py

После написания кода C в модуле следующим шагом будет его компиляция в файл pyd (файл pyd может быть напрямую импортирован кодом Python). Python предоставляет инструментальные функции для прямой компиляции.Пример кода выглядит следующим образом.

from distutils.core import setup, Extension

module1 = Extension('demo',
                    sources = ['demo_module.c']
                    )

setup (name = 'a demo extension module',
       version = '1.0',
       description = 'This is a demo package',
       ext_modules = [module1])

3 Выполните компиляцию

перечислитьsetup.py, то есть введите следующую команду:

python setup.py build_ext --inplace

Среди них --inplace указывает, что файл pyd создается в исходном коде. После выполнения вышеуказанной команды вы получите следующие файлы.

demo.cp36-win_amd64.pyd

4 тест

Тест выглядит следующим образом:

>>> import demo
>>> print(demo.mul_and_add(2,3))
12
>>> print(demo.mul_and_add(1,1))
2