Cetus Group
Cetus Logo
Информационные системы и программное обеспечение



Файлы проекта

Поддержка

 
Расширение и встраивание Python
Редакция 06.02.2006
А.Г. © Часть 1 - "Простой пример расширения 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

Copyright©2005, Cetus Group : All rights reserved.