Язык программирования Python

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



Содержание раздела