📝 Как написать модуль на C для Python: пошаговое руководство
Чтобы написать модуль Python на языке C, вам потребуется использовать C API Python.
Вот простой пример:
#include <Python.h>
static PyObject* my_function(PyObject* self, PyObject* args) {
// код вашей функции на C
// ...
return Py_None;
}
static PyMethodDef module_methods[] = {
{"my_function", my_function, METH_VARARGS, "Моя функция"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef mymodule = {
PyModuleDef_HEAD_INIT,
"mymodule",
NULL,
-1,
module_methods
};
PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule);
}
Затем скомпилируйте код C с использованием специальных флагов для включения поддержки Python.
Компиляция на Linux:
gcc -pthread -o mymodule.so -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -I/usr/include/python3.8 -I/usr/include/python3.8 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions -grecord-gcc-switches -fstack-protector-strong -Wformat -Werror=format-security -g
Компиляция на macOS:
gcc -pthread -o mymodule.so -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/sqlite/include -I/usr/include/python3.8 -I/usr/include/python3.8 -I/usr/local/include/python3.8 -I/usr/local/include/python3.8 -c mymodule.c
После компиляции вы получите файл mymodule.so
, который может быть импортирован и использован в Python.
Детальный ответ
Как написать модуль Python на языке C
Написание модуля на языке C для использования в Python может быть полезным, когда требуется повысить производительность или использовать существующий код на C. В этой статье мы рассмотрим пошаговый процесс написания модуля Python на языке C и включим примеры кода.
Шаг 1: Подготовка окружения
Прежде чем начать, убедитесь, что у вас установлены следующие компоненты:
- Компилятор C (например, GCC или Clang)
- Python Development Headers (обычно устанавливаются с пакетом Python)
- Setuptools (установщик пакетов Python)
Шаг 2: Создание заголовочного файла
Первым шагом является создание заголовочного файла, в котором объявляются функции вашего модуля. Создайте новый файл с расширением ".h" и определите функции, которые вы хотите использовать в модуле.
/* Пример заголовочного файла mymodule.h */
#ifndef MYMODULE_H
#define MYMODULE_H
void hello_from_c();
int add_numbers(int a, int b);
#endif
Шаг 3: Создание исходного файла
Следующим шагом является создание исходного файла, который содержит реализацию функций, объявленных в заголовочном файле. Сохраните файл с расширением ".c". В приведенном ниже примере используются функции, объявленные в предыдущем шаге.
/* Пример исходного файла mymodule.c */
#include "Python.h"
#include "mymodule.h"
static PyObject* hello_from_c(PyObject* self, PyObject* args) {
printf("Привет из C!\n");
Py_RETURN_NONE;
}
static PyObject* add_numbers(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
int sum = a + b;
return Py_BuildValue("i", sum);
}
static PyMethodDef mymodule_methods[] = {
{"hello_from_c", hello_from_c, METH_NOARGS, "Выводит приветствие из C"},
{"add_numbers", add_numbers, METH_VARARGS, "Складывает два числа"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef mymodule_module = {
PyModuleDef_HEAD_INIT,
"mymodule",
NULL,
-1,
mymodule_methods
};
PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule_module);
}
Шаг 4: Создание setup.py
Для сборки и установки модуля Python на языке C нам понадобится файл setup.py. Создайте новый файл с именем "setup.py" и задайте необходимые параметры:
from setuptools import setup, Extension
module = Extension('mymodule', sources=['mymodule.c'])
setup(
name='mymodule',
version='1.0',
ext_modules=[module]
)
Шаг 5: Сборка и установка модуля
Для сборки и установки модуля выполните следующие команды в командной строке:
$ python setup.py build
$ python setup.py install
Шаг 6: Использование модуля Python на языке C
Теперь, когда модуль установлен, вы можете использовать его в своих Python-скриптах. Импортируйте модуль и вызывайте функции, определенные в нем.
import mymodule
mymodule.hello_from_c()
result = mymodule.add_numbers(2, 3)
print(result)
Заключение
Теперь у вас есть основы для создания модуля Python на языке C. Вы можете использовать этот подход, чтобы создавать более быстрые и эффективные модули, или переиспользовать существующий C-код в вашем проекте на Python.