Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Опубликован: 22.12.2005 | Уровень: для всех | Доступ: платный
Лекция 13:
Интеграция 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 очень стабилен и в большинстве случаев не дает утечек памяти.