Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 18360 / 653 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 13:

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

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >

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

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >
Денис Хохлов
Денис Хохлов

Будет ли адаптация лекций под Python 3?

Арсений Бердюгин
Арсений Бердюгин

скачал с оффсайта последнюю версию python под windows. запускаю примеры из лекции и оно ругается на синтаксис.

Синтаксис примеров в лекции не актуален?
 

Berkut Molodoy
Berkut Molodoy
Россия
Михаил Комаров
Михаил Комаров
Россия, Нижний Новгород, Нижегородский коммерческий институт