SlideShare a Scribd company logo
1 of 23
Download to read offline
RAZONES PARA ACCEDER A C DESDE
PYTHON
1. Utilizar una librería implementada en C/C++
2. Acelerar nuestro código
3. Embeber Python como lenguaje de script en nuestro
producto
VARIAS OPCIONES POSIBLES
Interfaz Python/C
CTypes
SWIG
Cython
Otras (No tratadas aquí)
Boost.Python
cffi
pybind11
¿CUÁL ES LA BUENA?
De eso va esta charla
La respuesta es muy sencilla
Depende ;-)
PAŔAMETROS PARA TOMAR UNA
DECISIÓN
¿Necesitamos librerías adicionales?
¿Código intermedio autogenerado?
¿Necesita ser compilado?
¿Qué tal se lleva con NumPy?
¿Necesito soporte para C++, o me vale con C?
AVISOS PARA NAVEGANTES
Si Cuando nuestro código peta en C, se llevará por delante
al intérprete de Python.
Necesitamos un compilador de C.
Si queremos que nuestro módulo funcione en las tres
plataformas principales (Linux/Mac/Windows)
necesitaremos tres compiladores.
Problemas típicos en C: desbordamiento de buffers, fugas
de memoria, punteros, etc...
OPCIÓN 1: API PYTHON/C
Podemos escribir directamente código en C, que puede
ser llamado desde Python, aceptando y/o devolviendo
objetos nativos de Python
No es tan complicado, si es un caso de uso sencillo. Es
sobre todo código repetitivo: parsear argumentos de
entrada, convertir tipos de datos de entrada, convertir
tipos de datos de salida...
Lo más complicado es el tema de los contadores de
referencias, y quien es el responsable de incrementarlos y
decrementarlos.
#include <Python.h>
static long counter = 0;
static PyObject * lab1_reset(PyObject *self, PyObject *args) {
    counter = 0;
    Py_INCREF(Py_None);
    return Py_None; 
    }
static PyIntObject * lab1_get(PyObject *self, PyObject *args) {
    PyIntObject *result = Py_BuildValue("l", counter);
    if (result == NULL) { return NULL; }
    Py_INCREF(result);
    return result;
    }
                        
static PyMethodDef Methods[] = {
    {"reset", lab1_reset, METH_VARARGS, "Iniciamos contador a cero"},
    {"inc", lab1_inc, METH_VARARGS, "Incrementamos contador"},
    {"dec", lab1_dec, METH_VARARGS, "Decrementamos contador"},
    {"get", lab1_get, METH_VARARGS, "Leemos el contador"},
    {NULL, NULL, 0, NULL}        /* Sentinel */
    };
PyMODINIT_FUNC initlab1(void) {
    counter = 0;
    PyObject *m = Py_InitModule3("lab1", Methods, "Ejemplo interfaz Python/C
    if (m == NULL) {
        return;
        }
    }
                        
PROS Y CONTRAS
 No necesita librerías adicionales
 Puede llamar a código C y C++
 Podemos usar distutilspara compilar y distribuir
 NumPY tiene una extensión para usar Arrays
 Puede resultar complejo de mantener
 Hay que escribir bastante código intermedio
 Necesita compilar
OPCION 2: CTYPES
Ctypes es una librería estándar de Python que nos
permite realizar llamadas a librerías externas
Proporciona conversión a datos nativos de C, y permite
llamar a librerías estáticas o dinámicas (*.so en Linux,
*.DLL en Windows, *.dylib en Mac)
Podemos llamar a código C sin escribir ni una línea de C,
solo un wrapper en Python
import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
print(libc.time())
                    
PROS Y CONTRAS DE CTYPES
 No necesita librerías adicionales ¡Viene en la librería
estándar!
 No necesita compilador
 No necesitas saber C, todo se hace en Python
 Puede llamar a código C ...  pero lo tiene más
complicado para C++
 NumPY tiene algunas extensiones para usar con cTypes
...  pero el soporte no es completo
 Las conversiones entre datos pueden ser más lentas
 Puede ser complicado si queremos código
multiplataforma
OPCIÓN 3: SWIG
SWIG significa Simplified Wrapper Interface Generator
Es una herramienta que conecta librerías escritas en C y
en C++ con varios lenguajes de alto nivel, entre ellos
Python
SWIG autogenera el código repetitivo de los wrappers por
tí (Porque tú lo vales)
Se basa en la interfaz Python-C que vimos como primera
opción
CÓDIGO C
#include <stdio.h>
static long counter = 0;
void dec() {
    counter­­;
    if (counter < 0) { counter = 0; }
    }
void reset() {  counter = 0; }
void inc() { counter++; }
long get() { return counter; }
                    
SWIG INTERFACE FILE
/* counter.i */
%module counter 
%{
void reset();
long get();
void inc();
%}
 
extern void reset();
extern long get();
extern void inc();
                
PROS Y CONTRAS DE SWIG
 Puede generar el código wrapper automáticamente a
partir de los ficheros *.h de C
 Pero ese código es un coñazo puede ser difícil de
entender para humanos
 Puede trabajar indistintamente con C y con C++
 Puede generar interfaces con otros lenguajes además
de python
 Tiene soporte para NumPY
 Tiene una curva de aprendizaje un poco dura
OPCIÓN 4: CYTHON
Cython (No confundir con CPython) es un lenguaje y
compilador pensado para escribir extensiones en C/C++
Es un Super Conjunto de Python, es decir, todo*
programa correcto en Python es también un programa
Cython
* Casi todo
Cython añade ciertas anotaciones y estructuras para
realizar llamadas a código C
Como beneficio añadido, Cython compila, lo que ofrece
una mejora de rendimiento inmediato
MÁS COSAS DE CYTHON
Lo más interesante es que permite hacer optimización
iterativa. Empiezas con tu código Python original y poco a
poco optimizas lo te interese
Es parecido a SWIG ya que genera automáticamente
código de wrapping, pero no usa un fichero externo,
sino que se especifican las opciones de wrapping
directamente sobre el código Python
Al igual que SWIG, se apoya en la interfaz Python-C que
vimos como primera opción
CÓDIGO CYTHON (COUNTER.PYX)
counter = 0
def reset():
    global counter
    counter = 0
def inc(int delta=1):
    global counter
    counter += 1
def get():
    global counter
    return counter
PROS Y CONTRAS DE CYTHON
 Lenguaje similar a Python (Algo así como Python con
tipos) que nos permite escribir extensiones en C/C++
 Compila código Python puro, obteniendose un
incremento aproximado de rendimiento de un 50% desde
el minuto cero
 Código autogenerado (Pero Soporta GNU debugger)
 Permite optimización iterativa
 Soporta NumPy
 Necesita compilador
RESUMEN
  Python/C CTypes SWIG Cython
Librería
adicional
No No Si Si
Código
generado
No No Si Si
Hay que
compilar
Si No Si Si
C++ Si Parcial Parcial Si
NumPy Si Parcial Si Si
Mejores opciones para acceder a C desde Python

More Related Content

What's hot

Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...
Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...
Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...iosrjce
 
Git with t for teams
Git with t for teamsGit with t for teams
Git with t for teamsSven Peters
 
Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureAndrii Gakhov
 
Keepit Course 5: Tools for Assessing Trustworthy Repositories
Keepit Course 5: Tools for Assessing Trustworthy RepositoriesKeepit Course 5: Tools for Assessing Trustworthy Repositories
Keepit Course 5: Tools for Assessing Trustworthy RepositoriesJISC KeepIt project
 
SysML v2 and MBSE: The next ten years
SysML v2 and MBSE: The next ten yearsSysML v2 and MBSE: The next ten years
SysML v2 and MBSE: The next ten yearsEd Seidewitz
 
Gpu Systems
Gpu SystemsGpu Systems
Gpu Systemsjpaugh
 
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloud
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloudPart 3 Maximizing the utilization of GPU resources on-premise and in the cloud
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloudUniva, an Altair Company
 
10. GPU - Video Card (Display, Graphics, VGA)
10. GPU - Video Card (Display, Graphics, VGA)10. GPU - Video Card (Display, Graphics, VGA)
10. GPU - Video Card (Display, Graphics, VGA)Akhila Dakshina
 
오픈소스GIS의 이해와 활용
오픈소스GIS의 이해와 활용오픈소스GIS의 이해와 활용
오픈소스GIS의 이해와 활용SANGHEE SHIN
 
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...WSO2
 
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person Training
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person TrainingGabriel Font (2021) Simulation of a TaxiBot Operation for First Person Training
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person TrainingFrancisco Javier Mora Serrano
 

What's hot (13)

Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...
Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...
Implementation of 32 Bit Binary Floating Point Adder Using IEEE 754 Single Pr...
 
inmation Presentation
inmation Presentationinmation Presentation
inmation Presentation
 
Iot applications in manufacturing
Iot applications in manufacturingIot applications in manufacturing
Iot applications in manufacturing
 
Git with t for teams
Git with t for teamsGit with t for teams
Git with t for teams
 
Let's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architectureLet's start GraphQL: structure, behavior, and architecture
Let's start GraphQL: structure, behavior, and architecture
 
Keepit Course 5: Tools for Assessing Trustworthy Repositories
Keepit Course 5: Tools for Assessing Trustworthy RepositoriesKeepit Course 5: Tools for Assessing Trustworthy Repositories
Keepit Course 5: Tools for Assessing Trustworthy Repositories
 
SysML v2 and MBSE: The next ten years
SysML v2 and MBSE: The next ten yearsSysML v2 and MBSE: The next ten years
SysML v2 and MBSE: The next ten years
 
Gpu Systems
Gpu SystemsGpu Systems
Gpu Systems
 
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloud
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloudPart 3 Maximizing the utilization of GPU resources on-premise and in the cloud
Part 3 Maximizing the utilization of GPU resources on-premise and in the cloud
 
10. GPU - Video Card (Display, Graphics, VGA)
10. GPU - Video Card (Display, Graphics, VGA)10. GPU - Video Card (Display, Graphics, VGA)
10. GPU - Video Card (Display, Graphics, VGA)
 
오픈소스GIS의 이해와 활용
오픈소스GIS의 이해와 활용오픈소스GIS의 이해와 활용
오픈소스GIS의 이해와 활용
 
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...
Choreo - Build unique digital experiences on WSO2's platform, secured by Etho...
 
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person Training
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person TrainingGabriel Font (2021) Simulation of a TaxiBot Operation for First Person Training
Gabriel Font (2021) Simulation of a TaxiBot Operation for First Person Training
 

Viewers also liked

1. Introducción a las Hojas de estilo (CSS)
1. Introducción a las Hojas de estilo (CSS)1. Introducción a las Hojas de estilo (CSS)
1. Introducción a las Hojas de estilo (CSS)Aplicaciones Gráficas
 
Hojas de estilo (css)
Hojas de estilo (css)Hojas de estilo (css)
Hojas de estilo (css)Krolina Agui
 
Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)Juan Rodríguez
 
Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Pedro Ballesteros
 
Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Pedro Ballesteros
 
11 Slides de Droidcon NYC
11 Slides de Droidcon NYC11 Slides de Droidcon NYC
11 Slides de Droidcon NYCRoberto Allende
 
Fundamentos de DSDM Atern
Fundamentos de DSDM AternFundamentos de DSDM Atern
Fundamentos de DSDM AternAgile-Barcelona
 
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)Jose Casal-Gimenez FBCS CITP
 
Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014Alejandro Gabay
 
Personal Kanban Chileagil
Personal Kanban ChileagilPersonal Kanban Chileagil
Personal Kanban ChileagilDavid Lay
 
Workshop básico de Retrospectivas Multinivel
Workshop básico de Retrospectivas MultinivelWorkshop básico de Retrospectivas Multinivel
Workshop básico de Retrospectivas MultinivelHiroshi Hiromoto
 
Arquitecto Agil: Experiencias y Lecciones Aprendidas
Arquitecto Agil: Experiencias y Lecciones AprendidasArquitecto Agil: Experiencias y Lecciones Aprendidas
Arquitecto Agil: Experiencias y Lecciones AprendidasJersson Dongo
 
Kanban y Scrum. 2do Agile Open Paraná
Kanban y Scrum. 2do Agile Open ParanáKanban y Scrum. 2do Agile Open Paraná
Kanban y Scrum. 2do Agile Open Paranágabrielpiccoli
 
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con PythonIntroducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con PythonJuan Rodríguez
 
Mobile Web 2.0: Collective Intelligence and Prosumers
Mobile Web 2.0: Collective Intelligence and ProsumersMobile Web 2.0: Collective Intelligence and Prosumers
Mobile Web 2.0: Collective Intelligence and ProsumersPedro Ballesteros
 
Flexibilidad Con Scrum
Flexibilidad Con ScrumFlexibilidad Con Scrum
Flexibilidad Con Scrumslimshadyx18
 
Scrum Extreme Programming para Programadores
Scrum Extreme Programming para ProgramadoresScrum Extreme Programming para Programadores
Scrum Extreme Programming para ProgramadoresErik Gur
 

Viewers also liked (20)

Css Introducción
Css IntroducciónCss Introducción
Css Introducción
 
1. Introducción a las Hojas de estilo (CSS)
1. Introducción a las Hojas de estilo (CSS)1. Introducción a las Hojas de estilo (CSS)
1. Introducción a las Hojas de estilo (CSS)
 
Hojas de estilo (css)
Hojas de estilo (css)Hojas de estilo (css)
Hojas de estilo (css)
 
Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)
 
Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0
 
Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0Enriched User Interfaces in Mobile Web 2.0
Enriched User Interfaces in Mobile Web 2.0
 
11 Slides de Droidcon NYC
11 Slides de Droidcon NYC11 Slides de Droidcon NYC
11 Slides de Droidcon NYC
 
Fundamentos de DSDM Atern
Fundamentos de DSDM AternFundamentos de DSDM Atern
Fundamentos de DSDM Atern
 
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)
Usando Kanban en el Gobierno Escocés (Spanish talk at #LKSE15)
 
Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014Metodologias agiles de gestion de proyecto. ORT 14.05.2014
Metodologias agiles de gestion de proyecto. ORT 14.05.2014
 
Personal Kanban Chileagil
Personal Kanban ChileagilPersonal Kanban Chileagil
Personal Kanban Chileagil
 
Workshop básico de Retrospectivas Multinivel
Workshop básico de Retrospectivas MultinivelWorkshop básico de Retrospectivas Multinivel
Workshop básico de Retrospectivas Multinivel
 
Arquitecto Agil: Experiencias y Lecciones Aprendidas
Arquitecto Agil: Experiencias y Lecciones AprendidasArquitecto Agil: Experiencias y Lecciones Aprendidas
Arquitecto Agil: Experiencias y Lecciones Aprendidas
 
Kanban y Scrum. 2do Agile Open Paraná
Kanban y Scrum. 2do Agile Open ParanáKanban y Scrum. 2do Agile Open Paraná
Kanban y Scrum. 2do Agile Open Paraná
 
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con PythonIntroducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
 
TDD Course (Spanish)
TDD Course (Spanish)TDD Course (Spanish)
TDD Course (Spanish)
 
Mobile Web 2.0: Collective Intelligence and Prosumers
Mobile Web 2.0: Collective Intelligence and ProsumersMobile Web 2.0: Collective Intelligence and Prosumers
Mobile Web 2.0: Collective Intelligence and Prosumers
 
Extreme Programming
Extreme ProgrammingExtreme Programming
Extreme Programming
 
Flexibilidad Con Scrum
Flexibilidad Con ScrumFlexibilidad Con Scrum
Flexibilidad Con Scrum
 
Scrum Extreme Programming para Programadores
Scrum Extreme Programming para ProgramadoresScrum Extreme Programming para Programadores
Scrum Extreme Programming para Programadores
 

Similar to Mejores opciones para acceder a C desde Python

Similar to Mejores opciones para acceder a C desde Python (20)

Integrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonIntegrando mis librerías C++ con Python
Integrando mis librerías C++ con Python
 
Manual c++01
Manual c++01Manual c++01
Manual c++01
 
Computacion para ingenieros
Computacion para ingenierosComputacion para ingenieros
Computacion para ingenieros
 
Exposicion de c.
Exposicion de c.Exposicion de c.
Exposicion de c.
 
actividad 4
actividad 4actividad 4
actividad 4
 
Caract
CaractCaract
Caract
 
Caract
CaractCaract
Caract
 
Python_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdfPython_Module_01_Courtesy.pdf
Python_Module_01_Courtesy.pdf
 
Caract
CaractCaract
Caract
 
Manual de python
Manual de pythonManual de python
Manual de python
 
Historia de c++
Historia de c++Historia de c++
Historia de c++
 
Historia de c++
Historia de c++Historia de c++
Historia de c++
 
Iniciando c
Iniciando cIniciando c
Iniciando c
 
Tutorial de- c. ++
Tutorial de- c. ++ Tutorial de- c. ++
Tutorial de- c. ++
 
Tutorial de-c ++
Tutorial de-c ++Tutorial de-c ++
Tutorial de-c ++
 
Tutorial de-c ++
Tutorial de-c ++Tutorial de-c ++
Tutorial de-c ++
 
Tutorial de-c
Tutorial de-cTutorial de-c
Tutorial de-c
 
Tutorial de-c
Tutorial de-cTutorial de-c
Tutorial de-c
 
Curso c++
Curso c++Curso c++
Curso c++
 
LENGUAJE C++
LENGUAJE C++LENGUAJE C++
LENGUAJE C++
 

More from Juan Rodríguez

Estados imposibles y como evitarlos
Estados imposibles y como evitarlosEstados imposibles y como evitarlos
Estados imposibles y como evitarlosJuan Rodríguez
 
Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)Juan Rodríguez
 
Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesJuan Rodríguez
 
Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)Juan Rodríguez
 
Viaje al centro de la locura con Javascript
Viaje al centro de la locura con JavascriptViaje al centro de la locura con Javascript
Viaje al centro de la locura con JavascriptJuan Rodríguez
 
Una imagen vale más que mil mentiras
Una imagen vale más que mil mentirasUna imagen vale más que mil mentiras
Una imagen vale más que mil mentirasJuan Rodríguez
 
Presentación estetoscopio
Presentación estetoscopioPresentación estetoscopio
Presentación estetoscopioJuan Rodríguez
 
Charla introducción a RaspberryPI
Charla introducción a RaspberryPICharla introducción a RaspberryPI
Charla introducción a RaspberryPIJuan Rodríguez
 
Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3Juan Rodríguez
 
¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanbanJuan Rodríguez
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcionalJuan Rodríguez
 
00 introducción a Python
00 introducción a Python00 introducción a Python
00 introducción a PythonJuan Rodríguez
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoJuan Rodríguez
 
Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008Juan Rodríguez
 
Algunos recursos para desarrollo Web
Algunos recursos para desarrollo WebAlgunos recursos para desarrollo Web
Algunos recursos para desarrollo WebJuan Rodríguez
 

More from Juan Rodríguez (18)

Estados imposibles y como evitarlos
Estados imposibles y como evitarlosEstados imposibles y como evitarlos
Estados imposibles y como evitarlos
 
Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)
 
Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para muggles
 
Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)
 
Viaje al centro de la locura con Javascript
Viaje al centro de la locura con JavascriptViaje al centro de la locura con Javascript
Viaje al centro de la locura con Javascript
 
Una imagen vale más que mil mentiras
Una imagen vale más que mil mentirasUna imagen vale más que mil mentiras
Una imagen vale más que mil mentiras
 
Presentación estetoscopio
Presentación estetoscopioPresentación estetoscopio
Presentación estetoscopio
 
Charla introducción a RaspberryPI
Charla introducción a RaspberryPICharla introducción a RaspberryPI
Charla introducción a RaspberryPI
 
Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3
 
¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
 
01 el lenguaje Python
01 el lenguaje Python01 el lenguaje Python
01 el lenguaje Python
 
00 introducción a Python
00 introducción a Python00 introducción a Python
00 introducción a Python
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Presentación appy/pod
Presentación appy/podPresentación appy/pod
Presentación appy/pod
 
Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008
 
Algunos recursos para desarrollo Web
Algunos recursos para desarrollo WebAlgunos recursos para desarrollo Web
Algunos recursos para desarrollo Web
 
Extranet Parlamento
Extranet ParlamentoExtranet Parlamento
Extranet Parlamento
 

Mejores opciones para acceder a C desde Python