Cómo incrustar código Python en un programa C
Paso 1: Instale el paquete de desarrollo de Python
Dado que necesita acceder a la API de Python/C, instale primero el paquete de desarrollo de Python.
En Debian, Ubuntu o Linux Mint:
En CentOS, Fedora o RHEL:
Después de una instalación exitosa, los archivos de encabezado de Python están en /usr/include /python2.7. Dependiendo de la distribución de Linux, la ruta exacta puede ser diferente. Por ejemplo, en CentOS 6 es /usr/include/python2.6.
Paso 2: Inicializar el intérprete y establecer la ruta
El primer paso para incorporar Python en C es inicializar el intérprete de Python, lo que se puede hacer con la siguiente función de C.
Después de inicializar el intérprete, debe establecer la ruta del módulo Python que se importará en su programa C. Por ejemplo, digamos que sus módulos de Python están ubicados en /usr/local/modules. Luego use la siguiente llamada a la función C para establecer la ruta.
Paso 3: Conversión de datos
Uno de los aspectos más importantes de incorporar Python en C es la conversión de datos. Para pasar datos de C a una función de Python, primero debe convertir los datos de tipos de datos de C a tipos de datos de Python. La API de Python/C proporciona varias funciones para lograr esto. Por ejemplo, para convertir una cadena C en una cadena Python, use la función PyString_FromString.
Otra función similar, PyInt_FromLong, convierte el tipo de datos long en C a Python int. Cada función API de Python/C devuelve una referencia de tipo PyObject.
Paso 4: Definir un módulo Python
Cuando desee incrustar código Python en otro lenguaje como C, el código debe escribirse como un módulo Python y luego usarse en el otro idioma" Importar". Entonces, veamos cómo importar módulos de Python en C.
A modo de ilustración, implementamos un ejemplo simple de módulo de Python de la siguiente manera:
La función de Python anterior toma una cadena como parámetro y devuelve dos cadenas repetidas. Por ejemplo, si la cadena de entrada es "ciberpersonas", la función devuelve 'ciberpersonasciberpersonas'. Nombra este archivo de módulo "printData.py" y colócalo en el directorio del módulo Python declarado anteriormente (/usr/local/modules).
Paso 5: Cargue un módulo de Python
Ahora que ha definido el módulo de Python, es hora de cargarlo en su programa C. El código C para importar un módulo se ve así:
Paso 6: construir los parámetros de la función
Cuando se carga un módulo, se pueden llamar las funciones de Python definidas en el módulo. Normalmente, necesitamos pasar uno o más parámetros a una función de Python. Tenemos que construir un objeto tupla de Python que incluya los parámetros de la función de Python.
En nuestro ejemplo, la función printData define un módulo que toma un parámetro. Por lo tanto, construimos un objeto tupla de Python de tamaño uno de la siguiente manera. Podemos configurar cada elemento del objeto tupla usando PyTuple_SetItem.
Hemos construido con éxito un parámetro para pasar a la llamada a la función, es hora de llamar a la función de Python desde el programa C.
Paso 7: Llamar a una función de Python
Una vez que el objeto tupla de Python se crea correctamente como parámetro de función, podemos llamar a una función de Python con parámetros.
Para hacer esto, primero obtenga una referencia a la función definida en el módulo usando PyObject_GetAttrString y luego llame a la función usando PyObject_CallObject. Por ejemplo:
Paso 8: Comprobación de errores
Una forma común de evitar errores de tiempo de ejecución es comprobar el valor de retorno de una función y tomar las medidas adecuadas en función del valor de retorno. De manera similar a la variable global errno en los programas C, la API de Python/C proporciona un indicador global que informa el último error ocurrido. Cuando falla una función API de Python/C, se configura un indicador global para indicar el error y se puede usar PyErr_Print para mostrar el trackback correspondiente legible por humanos. Por ejemplo:
Puedes comprobar fácilmente varios errores en tu aplicación.
Aquí está el programa C completo con código Python incrustado como se describe en este tutorial.
Paso 9: compilar y ejecutar
Guarde el código anterior en finalCode.c y vincule la biblioteca de Python (-lpython2.7) para compilar el código. Dependiendo de la distribución, se puede utilizar una versión diferente (por ejemplo, -lpython2.6).