Опубликован: 22.12.2005 | Уровень: для всех | Доступ: платный
Лекция 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 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Павел Ялганов
Павел Ялганов

Скажите экзамен тоже будет ввиде теста? или там будет какое то практическое интересное задание?

Максим Чиндясов
Максим Чиндясов
Россия, Нижний Новгород
Ольга Коваль
Ольга Коваль
Беларусь, Минск