Пример встраивания интерпретатора в программу на 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 ");

 PyRun_SimpleString("print time.localtime(time.time()) ");

 /* ... */

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

 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 очень стабилен и в большинстве случаев не дает утечек памяти.

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ