Як вставити код Python в програму C

Python - це одна з найпопулярніших мов програмування завдяки простому синтаксису, простоті навчання та крос-платформній підтримці. Крім того, у вас є багато високоякісних бібліотек та модулів Python, які дозволяють виконувати важкі операції лише кількома рядками коду. Це робить Python одним з найбільш продуктивних способів розробки прототипів. Тим не менше, Python не настільки швидкий, як мова програмування C, і багато критично важливих виробничих програм, таких як операційна система Linux, веб-сервери та бази даних, написані на C. Якщо ви розробляєте програму в C, але частина її потребує для написання в Python, ви можете написати для нього модуль Python і вбудувати модуль Python в програму C за допомогою API Python / C.

У цьому підручнику розглянемо, як використовувати Python / C API для вставки коду Python в C. Підручник завершиться повним прикладом виклику Python з коду C.

Крок 1: встановіть пакет розробки Python

Оскільки вам потрібно отримати доступ до API Python / C, спочатку встановіть пакет розробки Python.

На Debian, Ubuntu або Linux Монетний двір:

$ sudo apt-get install python2.7-dev

На CentOS, Fedora або RHEL:

$ sudo yum встановити python-devel

Після успішного встановлення файл заголовка Python буде знайдено в / usr / include / python2.7. Залежно від вашого дистрибутива Linux, точний шлях може бути різним. Наприклад, це / usr / include / python2.6 на CentOS 6.

Крок 2: ініціалізація перекладача та встановлення шляху

Першим кроком до вбудовування Python в C є ініціалізація інтерпретатора Python, що може бути зроблено з наступною функцією C.

Py_Initialize ();

Після ініціалізації інтерпретатора потрібно встановити шлях до модуля Python, який ви хочете імпортувати в програму C. Наприклад, скажімо, ваш модуль Python знаходиться в / usr / local / modules. Потім, використовуючи наступний виклик функції C, встановіть шлях.

PySys_SetPath ("/ usr / local / modules");

Крок 3: перетворення даних

Одним з найважливіших аспектів вкладення Python в C є перетворення даних. Щоб передавати дані до функції Python з C, потрібно спочатку перетворити дані з типів даних C в типи даних Python. Python / C API пропонує різні функції для виконання цього завдання. Наприклад, щоб перетворити рядок C у рядок Python, ми використовуємо функцію PyString_FromString ():

PyObject * pval; char * cString = "Cyberpersons"; pval = PyString_FromString (cString);

Інша подібна функція - PyInt_FromLong (), яка перетворює довгий тип даних в C до Python int. Кожна функція Python / C API повертає посилання на тип PyObject.

Крок 4: визначте модуль Python

Якщо ви хочете вбудувати код Python іншою мовою, такою як C, код повинен бути написаний у модулі Python, який потім "імпортується" іншою мовою. Отже, давайте розглянемо, як імпортувати модуль Python в C.

Для ілюстрації, давайте здійснимо простий приклад модуля Python наступним чином.

def printData (data): дані повернення + дані + 'n'

Вищенаведена функція Python приймає одну стрічку як аргумент і повертає два повторення рядка. Наприклад, якщо рядок введення є "cyberpersons", ця функція повертає "cyberpersonscyberpersons". Називайте цей файл модуля "printData.py" і помістіть модуль у раніше оголошений модуль Python (/ usr / local / modules).

Крок 5: завантаження модуля Python

Тепер, коли ви визначили свій модуль Python, пора завантажити його в програму C. Код C для імпорту модуля виглядає так:

// argv [1] задає ім'я файлу модуля ("printData.py"). pName = PyString_FromString (argv [1]); pModule = PyImport_Import (pName);

Крок 6: аргументи побудови функції

Після завантаження модуля ви можете викликати функції Python, визначені в модулі. Як правило, ми повинні передавати один або декілька аргументів до функції Python. Потрібно побудувати об'єкт Python tuple, який містить аргументи для функції Python.

У нашому прикладі функція printData (), визначена в нашому модулі, приймає один аргумент. Таким чином, ми побудуємо об'єкт набору Python з розміром один наступним чином. Ми можемо встановити кожен елемент у об'єкті tuple, використовуючи PyTuple_SetItem ().

PyObject * pythonArgument; pythonArgument = PyTuple_New (1); pValue = PyString_FromString (argv [3]); if (pValue == NULL) {return 1; } PyTuple_SetItem (pythonArgument, 0, pValue);

Ми успішно сконструювали один аргумент, який буде переданий по виклику функції, його час ми повинні називати функцією python з нашої програми C.

Крок 7: виклик функції Python

Коли об'єкт tuple Python успішно створений як аргументи функції, ми можемо викликати функцію Python, яка приймає аргументи. Для цього спочатку потрібно отримати посилання на функцію, визначену модулем, використовуючи PyObject_GetAttrString (), а потім викликати функцію за допомогою PyObject_CallObject (). Наприклад:

// argv [2] - це ім'я функції, визначене в pModule // pFunc - це посилання на функцію pFunc = PyObject_GetAttrString (pModule, argv [2]); pValue = PyObject_CallObject (pFunc, pythonArgument);

Крок 8: перевірка помилок

Найпоширенішим способом уникнення помилок під час виконання є перевірка поверненого значення функції та прийняття відповідних дій залежно від поверненого значення. Подібно до глобальної змінної errno у програмах C, Python / C API підтримує глобальний індикатор, який повідомляє про останню помилку, що сталася. Коли не вдається виконати функцію Python / C API, глобальний індикатор встановлений для позначення помилки, а PyErr_Print () може бути використаний для показу відповідного readable trackback. Наприклад:

pModule = PyImport_Import (pName); якщо (pModule! = NULL) {// робити щось корисне тут} else {PyErr_Print (); // print traceback fprintf (stderr, "Не вдалося завантажити"% s "n", argv [1]); повернути 1; }

Ви можете легко включити різні перевірки помилок всередині ваших програм.

Ось повна програма C, яка вставляє код Python, як описано в цьому посібнику.

// залежно від дистрибутиву точний шлях або версія Python можуть відрізнятися. #include </usr/include/python2.7/Python.h> #include <stdlib.h> #include <string.h> int main (int argc, char * argv []) (PyObject * pName, * pModule, * pDict , * pFunc; PyObject * pArgs, * pValue; Py_Initialize (); PySys_SetPath ("/ usr / local / modules"); // шлях до модуля для імпорту pName = PyString_FromString (argv [1]); pModule = PyImport_Import (pName); якщо (pModule! = NULL) {PyObject * pythonArgument; pythonArgument = PyTuple_New (1); pValue = PyString_FromString (argv [3]); if (pValue == NULL) {return 1; } PyTuple_SetItem (pythonArgument, 0, pValue); pFunc = PyObject_GetAttrString (pModule, argv [2]); якщо (pFunc && PyCallable_Check (pFunc)) {pValue = PyObject_CallObject (pFunc, pythonArgument); if (pValue! = NULL) {printf ("Повернення значення від функції% s", PyString_AsString (pValue)); } else {PyErr_Print (); }} else {if (PyErr_Occurred ()) PyErr_Print (); fprintf (stderr, "Не можу знайти функцію"% s "n", argv [2]); }} else {PyErr_Print (); fprintf (stderr, "Не вдалося завантажити"% s "n", argv [1]); повернути 1; }}

Крок 9: компіляція та виконання

Збережіть цей код у форматі finalCode.c і складіть код під час посилання на бібліотеку Python (-lpython2.7). Залежно від дистрибутиву, ви можете використовувати різні версії (наприклад, -lpython2.6).

$ gcc -o остаточний finalCode.c -lpython2.7

Запустіть скомпільований виконуваний файл за допомогою трьох аргументів:

/ final printData printData cyberpersons

Три аргументи в цьому іспиті - це ім'я модуля, ім'я функції в модулі, аргумент рядка, який буде переданий в функцію Python.

Ваш вихід буде таким:

Сподіваюся, що це допомагає.

джерело

залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.