ГЛАВНАЯ      ДОКУМЕНТАЦИЯ      СТАТЬИ      ПРОГРАММЫ      ССЫЛКИ      ФОРУМ      ДРУГОЕ   

Простой пример расширения 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

ПОМОЩЬ САЙТУ :
sms.Є®ЇЁ«Є  *PythonUA*
Для чего Вы используете Python?
Admin( 46 )
Web( 61 )
GUI( 37 )
Embedding ( 16 )
Другое( 34 )
Какими продуктами Вы пользовались?
Zope( 15 )
Plone( 1 )
TG( 7 )
Django( 15 )
Twisted( 5 )
Другими( 10 )
ДРУЗЬЯ:
LUG.DN.UA
D-FENS.ORG.UA
SLAV0NIC.XSS.RU
CETUS.COM.UA
ENTDEV.ORG
[Python Powered]
Rambler's Top100
Copyright © 2006 python.com.ua