Angel Freire <cuerty@gmail.com> http://blog.cuerty.com/charlas/eacpy PyCon Argentina 2010, Córdoba Extendiendo aplicacione...
Objetivos <ul><li>Interpretar código en Python dentro de una aplicación escrita en C o C++
Conocer (un poco) la API que CPython nos brinda para esto
Conocer las opciones para embeber Python en programas escritos en otros lenguajes </li></ul>
¿Porque? <ul><li>Ya tenemos una aplicación que cubre el 99% de los casos, queremos scriptear el 1% restante
Las reglas de negocio varían
No es necesario recompilar para agregar una nueva funcionalidad a la aplicación
Para permitirle a los usuarios finales extender fácilmente nuestra aplicación </li></ul>
¿Que es CPython? <ul><li>CPython es el interprete mas común de Python que existe
Esta programado en C
Esta disponible para varias plataformas
Se descarga de http://www.python.org
Esta compuesto por dos partes: </li><ul><li>Un interprete/shell
Una biblioteca </li></ul></ul>
¿Que es CPython? El mismo interprete de Python utiliza la biblioteca *. * Algunas distribuciones de Linux, como Ubuntu, el...
¿Que es la API de CPython? <ul><li>Es la API de dicha biblioteca
Brinda funcionalidad para: </li><ul><li>Interpretar código
Crear objetos
Importar módulos
Manejar excepciones
¡Mas! </li></ul></ul>
Ejemplo #1: Hola Mundo
Ejemplo #1: Hola Mundo
Inicializar y finalizar Antes de llamar a código en Python desde C se llama a  Py_Initialize . Esto se hace para: <ul><ul>...
Upcoming SlideShare
Loading in...5
×

Extendiendo aplicaciones en C y C++ con Python

3,302

Published on

Charla para la Pycon Argentina 2010 sobre embeber CPython en aplicaciones desarrolladas en C y C++.

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,302
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
31
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Extendiendo aplicaciones en C y C++ con Python

  1. 1. Angel Freire <cuerty@gmail.com> http://blog.cuerty.com/charlas/eacpy PyCon Argentina 2010, Córdoba Extendiendo aplicaciones en C y C++ con Python
  2. 2. Objetivos <ul><li>Interpretar código en Python dentro de una aplicación escrita en C o C++
  3. 3. Conocer (un poco) la API que CPython nos brinda para esto
  4. 4. Conocer las opciones para embeber Python en programas escritos en otros lenguajes </li></ul>
  5. 5. ¿Porque? <ul><li>Ya tenemos una aplicación que cubre el 99% de los casos, queremos scriptear el 1% restante
  6. 6. Las reglas de negocio varían
  7. 7. No es necesario recompilar para agregar una nueva funcionalidad a la aplicación
  8. 8. Para permitirle a los usuarios finales extender fácilmente nuestra aplicación </li></ul>
  9. 9. ¿Que es CPython? <ul><li>CPython es el interprete mas común de Python que existe
  10. 10. Esta programado en C
  11. 11. Esta disponible para varias plataformas
  12. 12. Se descarga de http://www.python.org
  13. 13. Esta compuesto por dos partes: </li><ul><li>Un interprete/shell
  14. 14. Una biblioteca </li></ul></ul>
  15. 15. ¿Que es CPython? El mismo interprete de Python utiliza la biblioteca *. * Algunas distribuciones de Linux, como Ubuntu, eligen compilar el interprete de manera estática, por lo que el mismo no esta linkeado contra la biblioteca.
  16. 16. ¿Que es la API de CPython? <ul><li>Es la API de dicha biblioteca
  17. 17. Brinda funcionalidad para: </li><ul><li>Interpretar código
  18. 18. Crear objetos
  19. 19. Importar módulos
  20. 20. Manejar excepciones
  21. 21. ¡Mas! </li></ul></ul>
  22. 22. Ejemplo #1: Hola Mundo
  23. 23. Ejemplo #1: Hola Mundo
  24. 24. Inicializar y finalizar Antes de llamar a código en Python desde C se llama a Py_Initialize . Esto se hace para: <ul><ul><li>Crear la lista de módulos cargados ( sys.modules )
  25. 25. Crear los módulos básicos ( __main__, __builtin__, sys )
  26. 26. Crear la lista de donde se buscan los módulos ( sys.path ) </li></ul></ul>Es obligatorio llamar a esta función.
  27. 27. Inicializar y finalizar Al terminar de utilizar la biblioteca se debe llamar a Py_Finalize o Py_Exit : <ul><ul><li>Destruye todos los objetos e interpretes creados
  28. 28. Libera la memoria utilizada </li></ul></ul>La diferencia entre uno u otro es que el segundo también finaliza el proceso. Si no se llama a alguna de estas funciones al terminar de usar la biblioteca existe un comportamiento indeterminado.
  29. 29. Ejecutando código Así como PyRun_SimpleString existen otras formas de ejecutar código en Python: <ul><ul><li>PyRun_AnyFile para archivos o devices.
  30. 30. PyRun_InteractiveOne para una interpretar linea interactiva.
  31. 31. PyRun_InteractiveLoop para interpretar muchas lineas de manera interactiva.
  32. 32. PyRun_File para ejecutar un archivo.
  33. 33. PyEval_EvalCode para evaluar código. </li></ul></ul>Mas las funciones para llamar a objetos.
  34. 34. Objetos <ul><li>Los objetos de Python se representan en C como punteros a PyObject .
  35. 35. Cada tipo de datos tiene al menos una función que crea un objeto de ese tipo.
  36. 36. Y tiene varias funciones para operar sobre ese tipo de datos. </li></ul>
  37. 37. Objetos <ul><li>Crear un entero en Python desde un long en C: PyInt_FromLong
  38. 38. Controlar si el PyObject* es una lista: PyList_Check
  39. 39. Obtener un char* en C de un str/bytes en Python: PyString_AsString
  40. 40. Controlar el tamaño de una Tupla: PyTuple_Size
  41. 41. Controlar si determinada key esta en el diccionario: PyDict_Contains
  42. 42. Agregar un elemento a una lista: PyList_Append </li></ul>
  43. 43. Mas objetos Existen mas tipos de datos en la API de CPython: <ul><ul><li>Booleans
  44. 44. Float
  45. 45. Unicode
  46. 46. Sets
  47. 47. Iteradores
  48. 48. Buffers </li></ul></ul>Y también existen muchas mas funciones especificas para la necesidad de cada tipo de datos.
  49. 49. Ejemplo #2
  50. 50. Linea por linea: Objetos PyObject *pModule, *pFunction, *x, *y, *pArgs, *pResponse; Crea 6 variables del tipo PyObject* para contener: <ul><ul><li>El modulo
  51. 51. La función
  52. 52. Los dos parámetros de la función
  53. 53. La lista de parámetros para pasar a la función
  54. 54. La respuesta </li></ul></ul>
  55. 55. Linea por linea: import math pModule = PyImport_ImportModule(&quot;math&quot;); pFunction = PyObject_GetAttrString(pModule, &quot;pow&quot;); Importa el modulo “ math ” y guarda en pFunction una referencia a la función “ pow ” de dicho modulo.
  56. 56. Linea por linea: chequeos if (PyCallable_Check(pFunction)) { .... } Controla el valor guardado en pFunction se puede llamar (es decir, es un objeto con una función __call__ ).
  57. 57. Linea por linea: Crear objetos x = PyInt_FromLong(2L); y = PyInt_FromLong(2L); pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs, 0, x); PyTuple_SetItem(pArgs, 1, y); Crea dos objetos del tipo int y los guarda dentro de las variables x e y. Después crea una tupla de dos elementos de largo y pone a x en el primer lugar e y en el segundo.
  58. 58. Linea por linea: Llamar a la función pResponse = PyObject_CallObject(pFunction, pArgs); if (PyFloat_Check(pResponse)) { double res = PyFloat_AsDouble(pResponse); printf(&quot;math.pow(2,2) es igual a %f &quot;, res); } Llama a la función y trata de interpretar la respuesta como un objeto del tipo float . Si es así lo convierte a un objeto double de C y lo imprime usando la función de la biblioteca estándar de C printf .
  59. 59. Linea por linea: Ref counting Py_XDECREF(pFunction); Py_XDECREF(x); Py_XDECREF(y); Py_XDECREF(pArgs); Py_XDECREF(pResponse); Py_DECREF(pModule); Decrementa el conteo de referencias a todos esos objetos, Py_XDECREF controla si los objetos son nulos antes de decrementar, Py_DECREF no.
  60. 60. Reference Counting CPython lleva cuenta de cuantas referencias hay a un objeto. Cuando el conteo llega a cero significa que se puede liberar la memoria que dicho objeto esta usando. Este mecanismo de Garbage Collection es conocido como Reference Counting. Si utilizamos la API de CPython nosotros como programadores somos los responsables de esta tarea y debemos realizarla utilizando Py_DECREF y Py_XDECREF .
  61. 61. Cosas que quedaron afuera <ul><li>Manejo de excepciones.
  62. 62. ¡Mas funciones!
  63. 63. Multithreading </li><ul><li>GIL sigue existiendo
  64. 64. Se pueden crear muchos interpretes
  65. 65. Se puede ejecutar un interprete desde muchos threads pero es necesario crear un estado para cada uno </li></ul></ul>
  66. 66. Mas información Python/C API Reference Manual: http://docs.python.org/c-api/intro.html Extending and Embedding the Python Interpreter: http://docs.python.org/extending/index.html URL de esta presentación: http://blog.cuerty.com/charlas/eacpy/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×