Проще всего, пожалуй, запустить программный код Python из C можно с помощью функции API PyRun_SimpleString. Обращаясь к ней, программы C могут выполнять программы Python, представленные в виде массивов символьных строк C. Эта функция весьма ограничена: весь программный код выполняется в одном и том же пространстве имен (модуль __main__), строки программного кода должны быть инструкциями Python (не выражениями), отсутствует простой способ обмена входными и выходными данными с выполняемым программным кодом Python.
Тем не менее, это простой способ для начала. Кроме того, с добавлением импортируемого модуля расширения C, который может задействоваться встраиваемым программным кодом Python для обеспечения связи с объемлющим слоем C, такой прием может с успехом обеспечивать множественные цели встраивания. Для демонстрации основ в примере 20.23 приводится программа C, которая выполняет программный код Python и получает те же результаты, что были получены в интерактивном сеансе, приведенном в предыдущем разделе.
Пример 20.23. PP4E\Integrate\Embed\Basics\embed-simple.c
/*********************************************************************
# простые строки программного кода: C действует как интерактивная
# оболочка, код выполняется в модуле __main__, вывод не посылается в C;
*********************************************************************/
#include <Python.h> /* определение стандартного API */
main() {
printf("embed-simple\n");
Py_Initialize();
PyRun_SimpleString("import usermod"); /* загрузить файл .py */
PyRun_SimpleString("print(usermod.message)"); /* в пути поиска Python */ PyRun_SimpleString("x = usermod.message"); /* компилировать и выполнить */ PyRun_SimpleString("print(usermod.transform(x))");
Py_Finalize();
}
Во-первых, нужно отметить, что при встраивании Python программы C всегда вызывают функцию Py_Initialize, чтобы инициализировать подключаемые библиотеки Python, прежде чем использовать какие-либо другие функции API, и обычно вызывают функцию Py_Finalize для завершения интерпретатора.
Остальная часть программного кода проста — C передает интерпретатору Python готовые строки, примерно совпадающие с теми, что вводились в интерактивной оболочке. В действительности, можно было бы объединить все строки с программным кодом Python в одну строку через символ \n и передать интерпретатору в виде одной большой строки. Внутренне PyRun_SimpleString вызывает компилятор и интерпретатор Python для выполнения переданных из C строк. Как обычно, компилятор Python всегда есть в системах, где установлен Python.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011