domingo, 7 de agosto de 2022

¿Cómo ejecutar funciones escritas en C desde Python?


Imagen de entrada simbolos c y python

Llamando a una función creada en C desde Python.

Existen ocasiones en que nos vendría bien ejecutar funciones creadas en C desde Python. una de las razones puede ser, por ejemplo, ganar en rapidez en la ejecución de una determinada función, ya que al estar compilada, la función en C es bastante más rápida que su homóloga en Python.

¿Y como conseguimos esto? Pues usando el módulo de Python Ctypes.

Para conseguir nuestro objetivo vamos a seguir estos pasos:

  1. Crear un archivo en C con la función que queramos utilizar.
  2. Crear un archivo de biblioteca compartida (extensión .so) usando el compilador C.
  3. En nuestro programa en Python, creamos una instancia de ctypes.CDLL a partir del archivo compartido anterior.
  4. Finalmente, llamar a la función C usando el formato {CDLL_instance}.{nombre_funcion}({parametros_función}).


Paso 1: crear un archivo C con algunas funciones

#include <stdio.h>

int cuadrado(int i) 
{
    return i * i;
}


Hemos creado una función en C muy simple que devuelve el cuadrado de un número entero que le pasaremos como parámetro. El nombre de la función es "cuadrado". Guardamos el archivo con el nombre que queramos, en mi caso mi_funcion.c

Paso 2: crear el archivo de la biblioteca compartida

Podemos usar el siguiente comando para crear el archivo de biblioteca compartida desde el archivo fuente C que es mi_funcion.c

$ cc -fPIC -shared -o mi_funcion.so mi_funcion.c

El archivo con la biblioteca compartida se crea con el nombre de mi_funcion.so

Paso 3 y 4: Llamar a la función C desde el programa de Python


Creamos el programa en Python que utilizará la función creada en C.
from ctypes import *
# Ruta absoluta de la biblioteca compartida que contiene 
# la función.
so_file = "/home/chema/Cursos/mi_funcion.so"
# Creamos una instancia de CDLL pasándole como argumento
# la ruta de la biblioteca compartida.
mi_funcion = CDLL(so_file)
# Mostrará que el objeto creado es una instancia de la clase
# ctypes.CDLL
print(type(mi_funcion))
# Ejecutamos la función creada (paso 4).
print(mi_funcion.cuadrado(5))
print(mi_funcion.cuadrado(56))
Salida:
<class 'ctypes.CDLL'>
25
3136
Si cambias el archivo del programa en C, tendrás que volver a generar el archivo de la biblioteca compartida.

Conclusión

La implementación predeterminada de Python está escrita en lenguaje C y se llama CPython. Por lo tanto, no es muy raro usar funciones de C en un programa de Python.

En este pequeño tutorial, aprendimos cómo llamar fácilmente a funciones C en un programa de Python.



No hay comentarios:

Publicar un comentario