Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Пользоваться SWIG достаточно просто, если уметь применять компилятор и компоновщик (что в любом случае требуется при программировании на C/C++).

Простой пример использования SWIG

Предположим, что есть программа на C, реализующая некоторую функцию (пусть это будет вычисление частоты появления различных символов в строке):

Листинг

/* File : freq.c */

#include <stdlib.h>

int * frequency(char s[]) {

int *freq;

char *ptr;

freq = (int*)(calloc(256, sizeof(int)));

if (freq != NULL)

for (ptr = s; *ptr; ptr++)

freq[*ptr] += 1;

return freq;

}

Для

того чтобы можно было воспользоваться этой функцией из Python, нужно написать интерфейсный файл (расширение .i) примерно следующего содержания:

Листинг

/* File : freq.i */

%module freq

%typemap(out) int * {

int i;

$result = PyTuple_New(256);

for(i=0; i<256; i++)

PyTuple_SetItem($result, i, PyLong_FromLong($1[i]));

free($1);

}

extern int * frequency(char s[]);

Интерфейсные файлы содержат инструкции самого SWIG и фрагменты C/C++-кода, возможно, с макровключениями (в примере выше: $result, $1). Следует заметить, что для преобразования массива целых чисел в кортеж элементов типа long, необходимо освободить память из–под исходного массива, в котором подсчитывались частоты.

Теперь (подразумевая, что используется компилятор gcc), создание модуля расширения может быть выполнено примерно так:

Листинг

swig–python freq.i

gcc–c–fpic freq_wrap.c freq.c -DHAVE_CONFIG_H

— I/usr/local/include/python2.3–I/usr/local/lib/python2.3/config

gcc–shared freq.o freq_wrap.o–o _freq.so

После этого в рабочем каталоге появляется файлы _freq.so и freq.py, которые вместе и дают доступ к требуемой функции:

Листинг

>>> import freq

>>> freq.frequency(«ABCDEF»)[60:75]

(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L)

Помимо этого, можно посмотреть на содержимое файла freq_wrap.c, который был порожден SWIG: в нем, среди прочих вспомогательных определений, нужных самому SWIG, можно увидеть что–то подобное проиллюстрированному выше примеру модуля md5. Вот фрагмент этого файла с определением обертки для функции frequency:

Листинг

extern int *frequency(char []);

static PyObject *_wrap_frequency(PyObject *self, PyObject *args) {

PyObject *resultobj;

char *arg1 ;

int *result;

if(!PyArg_ParseTuple(args,(char *)«s:frequency»,&arg1)) goto fail;

result = (int *)frequency(arg1);

{

int i;

resultobj = PyTuple_New(256);

for(i=0; i<256; i++)

PyTuple_SetItem(resultobj, i, PyLong_FromLong(result[i]));

free(result);

}

return resultobj;

fail:

return NULL;

}

В

качестве упражнения, предлагается сопоставить это определение с файлом freq.i и понять, что происходит внутри функции _wrap_frequency. Подсказка: можно посмотреть еще раз комментарии к C–коду модуля md5.

Стоит еще раз напомнить, что в отличие от Python, в языке C/C++ управление памятью должно происходить в явном виде. Именно поэтому добавлена функция free при преобразовании типа. Если этого не сделать, возникнут утечки памяти. Эти утечки можно обнаружить, при многократном выполнении функции:

Листинг

>>> import freq

>>> for i in xrange(1000000):

… dummy = freq.frequency(«ABCDEF»)

>>>

Если функция freq.frequency имеет утечки памяти, выполняемый процесс очень быстро займет всю имеющуюся память.

Интеграция Python и других систем программирования

Язык программирования Python является сценарным языком, а значит его основное назначение — интеграция в единую систему разнородных программных компонентов. Выше рассматривалась (низкоуровневая) интеграция с C/C++-приложениями. Нужно заметить, что в большинстве случаев достаточно интеграции с использованием протокола. Например, интегрируемые приложения могут общаться через XML–RPC, SOAP, CORBA, COM, .NET и т.п. В случаях, когда приложения имеют интерфейс командной строки, их можно вызывать из Python и управлять стандартным вводом–выводом, переменными окружения. Однако есть и более интересные варианты интеграции.

Современное состояние дел по излагаемому вопросу можно узнать по адресу: http://www.python.org/moin/IntegratingPythonWithOtherLanguages

Java

Документация по Jython (это реализация Python на Java–платформе) отмечает, что Jython обладает следующими неоспоримыми преимуществами над другими языками, использующими Java–байт–код:

Jython–код динамически компилирует байт–коды Java, хотя возможна и статическая компиляция, что позволяет писать апплеты, сервлеты и т.п.;

Поддерживает объектно–ориентированную модель Java, в том числе, возможность наследовать от абстрактных Java–классов;

Jython является реализацией Python — языка с практичным синтаксисом, обладающего большой выразительностью, что позволяет сократить сроки разработки приложений в разы.

Правда, имеются и некоторые ограничения по сравнению с «обычным» Python. Например, Java не поддерживает множественного наследования, поэтому в некоторых версиях Jython нельзя наследовать классы от нескольких Java–классов (в тоже время, множественное наследование поддерживается для Python–классов).

Следующий пример (файл lines.py) показывает полную интеграцию Java–классов с интерпретатором Python:

Поделиться:
Популярные книги

Народ, да!

Коллектив авторов
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Народ, да!

Сборник "Солдат удачи"

Авраменко Александр Михайлович
Фантастика:
боевая фантастика
6.83
рейтинг книги
Сборник Солдат удачи

Гоголь

Степанов Николай Леонидович
324. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Гоголь

Егерь. Системный зверолов

Скиба Николай
1. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.50
рейтинг книги
Егерь. Системный зверолов

Прорыв реальности

Бурносов Юрий Николаевич
Новая зона
Фантастика:
боевая фантастика
6.40
рейтинг книги
Прорыв реальности

История Похитителя Тел

Райс Энн
4. Хроники вампиров
Фантастика:
ужасы и мистика
8.87
рейтинг книги
История Похитителя Тел

Тайник

Джордж Элизабет
12. Инспектор Линли
Детективы:
криминальные детективы
7.78
рейтинг книги
Тайник

Пьессы

Плавт Тит Макций
Старинная литература:
античная литература
7.00
рейтинг книги
Пьессы

Профессия: театральный критик

Якубовский Андрей
Документальная литература:
критика
5.00
рейтинг книги
Профессия: театральный критик

Открытие мира (Весь роман в одной книге)

Смирнов Василий Александрович
Проза:
классическая проза
русская классическая проза
советская классическая проза
5.00
рейтинг книги
Открытие мира (Весь роман в одной книге)

Ожог

Аксенов Василий Павлович
Проза:
современная проза
6.00
рейтинг книги
Ожог

Глубокое ущелье

Тахир Кемаль
Проза:
роман
5.25
рейтинг книги
Глубокое ущелье

Я бог. Книга XXXIX

Дрейк Сириус
39. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я бог. Книга XXXIX

Хроники Амбера. Книги Мерлина (авторский сборник)

Желязны Роджер Джозеф
Хроники Амбера
Фантастика:
фэнтези
9.26
рейтинг книги
Хроники Амбера. Книги Мерлина (авторский сборник)