Простой пример расширения Python
Расширение интерпретируемых языков программирования (в т.ч. Python) может понадобиться в следующих случаях:
-- В интерпретируемом языке отсутствует необходимая функциональность, например - драйвер к необходимому формату данных или сервису, но такая функциональность реализована для компилируемого языка (например, C).
-- В интерпретируемом языке есть необходимая функциональность, но она не отвечает необходимым требованиям (например, по скорости выполнения).
-- Интерпретируемый язык применялся для прототипирования программы с необходимостью дальнейшего переноса в компилируемый всего кода или критических участков.
В этих случаях необходимо обеспечить возможность вызова из интерпретатора функций, реализованных в компилируемом языке - т.е. выполнить расширение функциональности интерпретатора.
Для расширения функциональности Python средствами языка C необходимо выполнить:
-- Реализовать в C функции, обеспечивающие новую функциональность.
-- Зарегистрировать эти функции под определенными именами, поставив в соответствие указатель на код функции имени нового оператора в Python.
-- Предоставить интерпретатору информацию о новых операторах и точках входа в функции их обработки.
Ниже приведен простой пример реализации нового оператора Python - оператора вычисления длины гипотенузы прямоугольного треугольника. В примере реализована всего одна функция, при необходимости могут быть реализованы и другие функции - доступные интерпретатору при их регистрации в таблице методов, или "приватные" - без регистрации.
/*** c4py.c ***/
#include <python/Python.h>
//реализация функции hipot() для Python
//val - тьюпл с аргументами вызова функции
static PyObject *HipotCmd(PyObject *self,PyObject *val)
{
double a,b,c;
//получаем переданные в функцию аргументы (определены два аргумента типа double)
if(!PyArg_ParseTuple(val,"dd",&a,&b))
return NULL;
//вычисляем результат - длину гипотенузы
c = sqrt(a*a+b*b);
//преобразуем результат в объект Python и возвращаем результат преобразования интерпретатору
return Py_BuildValue("d",c);
}
//таблица методов модуля для интерпретатора
static PyMethodDef threeMethods[] = {
{"hipot",HipotCmd,METH_VARARGS,"Calc hipotenuse"},
{NULL,NULL,0,NULL}
};
//инициализация модуля three
void initthree(void)
{
Py_InitModule("three",threeMethods);
}
После компиляции модуля в разделяемую библиотеку:
gcc --shared c4py.c -o three.so
он может быть использован в Python-программе следующим образом:
import three
print three.hipot(3,4)
5.0
Источники:
cetus.com.ua
|
ПОМОЩЬ САЙТУ :
|
|
|