Título: Extender Python con C y C++ Publicado por: sukokiin en 3 Enero 2020, 14:52 pm qf60SP5-YLQ
SI damos un pequeño repaso de manera simple entendemos que Python al tratarse de un lenguaje interpretado se traduce a tiempo real de ejecución, es decir, se traduce linea uno y se ejecuta, se traduce linea dos y se ejecuta, lenguajes interpretados van traduciendo las instrucciones a tiempo de ejecucion, en cambio lenguajes compilados como C y C++ son traducidos en tiempo de compilación, para mas tarde ser ejecutado todo el conjunto en lenguaje maquina de una. Es decir C traduce el lenguaje de alto nivel a lenguaje maquina y luego ejecuta el programa, en cambio Python ejecuta el programa mientras va traduciendo a tiempo real el lenguaje maquina. Esto ocasiona lentitud en lenguajes Interpretados, y por eso entra en juego una maravillosa API que permite extender programas de Python haciéndolos mas veloces mediante llamadas a funciones e métodos ya compilados en C y C++. Como haríamos eso? Lo primero es tener instalado "Python.h" lo haremos mediante el siguiente comando para LInux, Ubuntu, etc... (En caso de WIndows, VIsual Studio por ejemplo,Propiedades -> Opciones de Proyecto -> C/C++ -> General -> Directorios de inclusión adicionales) Recomiendo la programación de extensiones solamente en Linux, Ubuntu, Debian o derivados... Código
SI no tenemos instalado C++ lo podemos instalar mediante -> Código
Una vez instalado todo simplemente escribiremos nuestra primera extensión de Python Código
Como observáis, el código comienza importando la librería "Python.h" la que ya incluye dentro de ella librerías como -> limits.h, string.h, stdlib.h, stdio.h, Entre otras, yo también importado "iostream" para hacer el codigo de C++, seguimos y declaramos una función de tipo puntero static PyObject la cual almacenara una dirección en memoria que luego sera llamada desde el Interprete de Python, si queremos pasar argumentos al invocar nuestra función en Python debemos especificar -> Código donde "ff" es el tipo de dato, ya sea int, string, char, float, double. (Información mas especifica podéis encontrarla en la documentación de la API), si seguimos observando el código podemos observar la funcion de retorno de tipo Código la cual no devolverá nada al finalizar la función. Podemos definir tantas funciones como queramos todas siempre llamadas Código Podemos fijarnos que hay un método con una función que si nos va a devolver un valor al finalizar la función y este es Código le especificamos la f de flotante y el dato del mismo tipo siempre, que queremos devolver al finalizar la función. Ya tenemos uno, dos o siete funciones en nuestra librería para Python, ahora lleva la parte de definirlas en una lista, en la cual definiremos un nombre, invocaremos la función, y definiremos una descripción. Código
Si podemos ver la lista, observamos en la primera que hemos dado nombre a la función, ese mismo nombre, "Suma", "Restar", etc... Sera el identificador mediante el cual podremos hacer uso de dicha funcion en Python, seguidamente ingresamos el nombre de la funcion, seguido de METH_VARARGS, y una pequeña descripción, como paso obligatorio para no generar diversos errores en la construcción de nuestro programa deberemos pasarle los parámetros -> Código . Entonces sabemos que -> Código
Y para finalizar solo quedaría iniciar todas las funciones pasadas por lista, es recomendable utilizar una extensión para funciones que tengan relación entre si, no crear librerías con funciones dedicadas a tareas muy distintas entre si, pues crearíamos confusión al usuario y a nosotros mismo. Es decir una librería para funciones de flujo, y otra para funciones de operaciones matematicas por ejemplo. Código Aqui iniciamos todas las funciones, vendria a ser el main de un programa sin API. Código
Con esto tendriamos definida una extension en C o C++, en este caso C++, pero ahora quedaria definirla en un archivo .py para poder construirla y instalarla. Código
Y ya estaria listo para ser usado, simplemente ejecutamos dentro de la carpeta donde se encuentras los dos archivos -> Código Y como extra os dejo con un script de python que hace uso de esta extension -> Código
Código
La documentación y mas detalles lo podéis encontrar en mi canal de YouTube. Gracias por tu tiempo y ayúdame a seguir mejorando. |