Python

Solo disponible en BuenasTareas
  • Páginas : 9 (2181 palabras )
  • Descarga(s) : 0
  • Publicado : 3 de marzo de 2012
Leer documento completo
Vista previa del texto
Universidad de Costa Rica | Escuela de Ingeniería Eléctrica IE-0117 Programación Bajo Plataformas Abiertas

Integración C - Python
1. El interprete de Python

El intérprete de Python es el programa que se encarga de leer el código fuente de los programas de Python y ejecutarlo. El intérprete de Python está escrito en el lenguaje de programación C. Por esta razón, es relativamente sencilloque un programa Python pueda acceder a bibliotecas compartidas escritas en los lenguajes C/C++ y viceversa. La integración entre C/C++ y Python puede darse en dos vías: Extensión: es posible crear módulos en C/C++ que sean llamados desde programas de Python. Incrustación: es posible llamar al intérprete de Python desde un programa C/C++, para ejecutar programas y fragmentos de código Python. En estedocumento se abordará únicamente la extensión, utilizando el lenguaje de programación C. El proceso de extensión se ilustra en la siguiente figura:

Como puede verse en la figura, el intérprete puede acceder a módulos, escritos en C o C++. Estos módulos, utilizando un formato especial, permiten crear funciones y tipos de datos que estarán disponibles para los programas de Python. Al estarescritos en C/C++, los módulos pueden utilizar todas las características de bajo nivel de estos lenguajes y acceder a bibliotecas que no están disponibles normalmente usando Python. Además, al tratarse de módulos compilados, puede obtenerse en algunos casos mejor desempeño que si se utilizara código Python interpretado. Es común crear módulos de Python que llaman directamente a bibliotecas de C/C++.Estos módulos se conocen como wrappers. Un ejemplo de esto es PyGTK, que permite acceder desde Python la biblioteca GTK, escrita originalmente en el lenguaje C. 1

IE-0117 Programación Bajo Plataformas Abiertas

Integración C - Python

2.

Creación de módulos para Python usando el lenguaje C

2.1. Estructura de los módulos
Suponga que se desea crear un módulo llamado sistop con dosfunciones: system() y getuid(). El uso de estas funciones se ilustra a continuación:
# Importa el módulo import sistop # Ejecuta el comando "ls -l" e imprime el estado retornado estado = sistop.system("ls -l") print estado # Imprime el UID del usuario que ejecuta el programa print sistop.getuid()

El módulo debe tener la siguiente estructura:
#include // Función sistop.system() static PyObject*sistop_system(PyObject *self, PyObject *args) { // Lectura de los argumentos // ... // Retorno de un objeto Python } // Función sistop.getuid(PyObject *self, PyObject *args) static PyObject *sistop_getuid() { // Lectura de los argumentos // ... // Retorno de un objeto Python } // Tabla de funciones/métodos static PyMethodDef FuncionesSistop[] = { {"system", sistop_system, METH_VARARGS, "Ejecuta uncomando"}, {"getuid", sistop_getuid, METH_VARARGS, "Obtiene el UID del usuario actual"}, {NULL, NULL, 0, NULL} } // Inicialización del módulo PyMODINIT_FUNC initsistop(void) { // Inicialización del módulo }

Las dos funciones al inicio corresponden a las funciones system() y getuid(). Todas las funciones (incluso las que no retornan nada en Python) deben retornar un puntero a una variable del tipoPyObject, que representa un objeto Python en C. Luego de definir las funciones debe incluirse la tabla de métodos del módulo. Esta tabla es una arreglo global, que permite mapear en nombre de la función en Python a la función correspondiente en C, además de definir información como la cadena de documentación de la función. 2

IE-0117 Programación Bajo Plataformas Abiertas

Integración C -Python

Finalmente, debe incluirse una función que permita inicializar el módulo. Esta función se ejecutará cuando el módulo sea importado por primera vez.

2.2. Implementación de las funciones del módulo
Como se mencionó anteriormente, todas las funciones deben retornar un puntero a un objeto PyObject. La función se declara estática (static), para garantizar que sea accesible solamente dentro...
tracking img