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