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

на главную

Жанры

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

0, /*tp_getattro*/

0, /*tp_setattro*/

0, /*tp_as_buffer*/

0, /*tp_xxx4*/

md5type_doc, /*tp_doc*/

};

// Функции модуля md5:

// Функция new для получения нового объекта типа md5type

static PyObject *

MD5_new(PyObject *self, PyObject *args)

{

md5object *md5p;

unsigned char *cp = NULL;

int len = 0;

// Разбор параметров. Здесь вертикальная черта

// в строке формата означает окончание

// списка обязательных параметров.

// Остальное — как и выше: s# - строка, после : — имя

if (!PyArg_ParseTuple(args, "|s#:new», &cp, &len))

return NULL;

if ((md5p = newmd5object) == NULL)

return NULL;

// Если был задан параметр cp:

if (cp)

MD5Update(&md5p->md5, cp, len);

return (PyObject *)md5p;

}

// Строка документации для new

PyDoc_STRVAR(new_doc, «new([arg]) -> md5 object …»);

// Список функций, которые данный модуль экспортирует

static PyMethodDef md5_functions[] = {

{«new», (PyCFunction)MD5_new, METH_VARARGS, new_doc},

{«md5», (PyCFunction)MD5_new, METH_VARARGS, new_doc},

{NULL, NULL} /* Sentinel */

};

// Следует заметить, что md5 — то же самое, что new. Эта функция оставлена для

// обратной совместимости со старым модулем md5

// Инициализация модуля

PyMODINIT_FUNC

initmd5(void)

{

PyObject *m, *d;

MD5type.ob_type = &PyType_Type;

// Инициализируется модуль

m = Py_InitModule3(«md5», md5_functions, module_doc);

// Получается словарь с именами модуля

d = PyModule_GetDict(m);

// Добавляется атрибут MD5Type (тип md5–объекта) к словарю

PyDict_SetItemString(d, «MD5Type», (PyObject *)&MD5type);

// Добавляется целая константа digest_size к модулю

PyModule_AddIntConstant(m, «digest_size», 16);

}

На основе этого примера можно строить собственные модули расширения, ознакомившись с документацией по C/API и документом «Extending and Embedding» («Расширение и встраивание») из стандартной поставки Python. Перед тем, как приступать к созданию своего модуля, следует убедиться, что это целесообразно: подходящего модуля еще не создано и реализация в виде чистого Python неэффективна. Если создан действительно полезный модуль, его можно предложить для включения в поставку Python. Для этого нужно просто связаться с кем–нибудь из разработчиков по электронной почте или предложить модуль в виде «патча» через http://sourceforge.net.

Пример встраивания интерпретатора в программу на C

Интерпретатор Python может быть встроен в программу на C с использованием C API. Это лучше всего демонстрирует уже работающий пример:

Листинг

/* File : demo.c */

/* Пример встраивания интерпретатора Python в другую программу */

#include «Python.h»

main(int argc, char **argv)

{

/* Передает argv[0] интерпретатору Python */

Py_SetProgramName(argv[0]);

/* Инициализация интерпретатора */

Py_Initialize;

/* … */

/* Выполнение операторов Python (как бы модуль __main__) */

PyRun_SimpleString(«import time\n»);

PyRun_SimpleString(«print time.localtime(time.time)\n»);

/* … */

/* Завершение работы интерпретатора */

Py_Finalize;

}

Компиляция этого примера с помощью компилятора gcc может быть выполнена, например, так:

Листинг

ver=«2.3»

gcc–fpic demo.c–DHAVE_CONFIG_H–lm–lpython${ver} \

— lpthread–lutil–ldl \

— I/usr/local/include/python${ver} \

— L/usr/local/lib/python${ver}/config \

— Wl, — E \

— o demo

Здесь следует отметить следующие моменты:

программу необходимо компилировать вместе с библиотекой libpython соответствующей версии (для этого используется опция–l, за которой следует имя библиотеки) и еще с библиотеками, которые требуются для Python: libpthread, libm, libutil и т.п.)

опция pic порождает код, не зависящий от позиции, что позволяет в дальнейшем динамически компоновать код

обычно требуется явно указать каталог, в котором лежит заголовочный файл Python.h (в gcc это делается опцией–I)

чтобы получившийся исполняемый файл мог корректно предоставлять имена для динамически загружаемых модулей, требуется передать компоновщику опцию–E: это можно сделать из gcc с помощью опции–Wl, — E. (В противном случае, модуль time, а это модуль расширения в виде динамически загружаемого модуля, не будет работать из–за того, что не увидит имен, определенных в libpython)

Здесь же следует сделать еще одно замечание: программа, встраивающая Python, не должна много раз выполнять Py_Initialize и Py_Finalize, так как это может приводить к утечке памяти. Сам же интерпретатор Python очень стабилен и в большинстве случаев не дает утечек памяти.

Использование SWIG

SWIG (Simplified Wrapper and Interface Generator, упрощенный упаковщик и генератор интерфейсов) - это программное средства, сильно упрощающее (во многих случаях — автоматизирующее) использование библиотек, написанных на C и C++, а также на других языках программирования, в том числе (не в последнюю очередь!) на Python. Нужно отметить, что SWIG обеспечивает достаточно полную поддержку практически всех возможностей C++, включая предобработку, классы, указатели, наследование и даже шаблоны C++. Последнее очень важно, если необходимо создать интерфейс к библиотеке шаблонов.

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

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Магнатъ

Кулаков Алексей Иванович
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
Магнатъ

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Экспансия

Гуров Валерий Александрович
3. Гридень
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Экспансия

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Лекарь Империи 10

Карелин Сергей Витальевич
10. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 10