miércoles, 19 de septiembre de 2012

Uso de Yield en Python

Se usa para funciones generadoras. Funciona como un return, pero la próxima vez que se llame el código continúa justo debajo de yield.

Código de ejemplo:

 def contador_yield(max2):
     print "Inicio contador_yield"
     n = 0
     while (n < max2):
         print "Deltro del while de contador_yield"
         yield n
         n +=1    
         print "Sigo dentro del metodo"
         print "Sigo dentro del metodo22"
         print "Sigo dentro del metodo233"
         
 c = contador_yield(3)

 print c.next()
 print "Ya he realizado la llamada"
 print c.next()
 print c.next()
 print c.next()

Salida:

Inicio contador_yield
 Deltro del while de contador_yield
 0
 Ya he realizado la llamada
 Sigo dentro del metodo
 Sigo dentro del metodo22
 Sigo dentro del metodo233
 Deltro del while de contador_yield
 1
 Sigo dentro del metodo
 Sigo dentro del metodo22
 Sigo dentro del metodo233
 Deltro del while de contador_yield
 2
 Sigo dentro del metodo
 Sigo dentro del metodo22
 Sigo dentro del metodo233
 Traceback (most recent call last):
   File "/home/carlos/workspace/test_yield.py", line 19, in 
     print c.next()
 StopIteration

Documentación:

Blog Python Manía. Uso de yield

Python Doc#yield

jueves, 2 de agosto de 2012

Carga de datos en OpenERP usando OpenETL

Introducción:

OpenETL es una librería en python de migración de datos de OpenERP S.A. Esta herramienta nos permite realizar todas las operaciones típicas de los ETL (extracción, transformación y carga) con el valor añadido de estar muy bien integrada con OpenERP. La página web de la librería es https://launchpad.net/openetl También existe una interfaz gráfica empaquetada como módulo (etl_interface) para OpenERP. Este módulo está en los extra-addons. Aunque desde la interfaz es más sencillo el manejo, este post se centrará en el uso de la librería python.

Instalación:

Para bajar la librería es necesario tener instalado bazaar http://es.wikipedia.org/wiki/Bazaar_(software). El comando concreto:
bzr branch lp:openetl
Una vez bajada la rama de openerp hay que copiar la carpeta openetl/lib/openetl a la carpeta de librerías de tu sistema. En mi caso /usr/lib/python2.6/ . Aunque en mi eclipse con PyDev ya tengo configurada esa ruta, Eclipse Indigo parece no pillar la librería a la primera. Para refrescar las librerías accesibles en eclipse hay que entrar en PyDev\Interpreter - Python pulsar sobre Restore Defaults (si ya teníamos configurado el sistema) y después sobre Apply.

Funcionamiento:

La librería se divide en trabajos, componentes, conectores, y transiciones.
  • Jobs: Procesos que se pueden ejecutar, pausar y parar.
  • Components: Componentes de entrada, salida y transformación. Nos permiten obtener datos y cargar datos en sistemas externos. Los componentes de transformación serán los que adapten los datos antes de realizar la carga final.
  • Connectors: Los conectores son los que definen las conexiones con los sistemas externos. Son usados por los componentes. La versión actual de la librería tiene conectores para tratar archivos locales, Openobjects, distintas bases de datos (postgres, mysql, oracle), urls (http, ftp, https, gopher), servicios webs xmlrpc, sugarCRM, distintos servicios de google (gdocs, gcalendar, gblog) y facebook.
  • Transitions: Las transiciones son el flujo por el que pasan los datos entre los distintos componentes.
El programador debe definir tantos conectores de entrada como salida necesite, al menos un componente por cada conector, y una transición mínima para pasar los datos de un componente a otro. Al estar los conectores “enlazados” con los componentes, al escribir los datos en el componente se escriben en el sistema externo.

Ejemplo:

Tenemos un sistema OrangeHRM instalado en la empresa con las fichas de recursos humanos que queremos migrar a OpenERP. El personal de recursos humanos ha exportado los datos a formato .csv y nos pide que realicemos la carga de datos a OpenERP. Lo que tenemos que hacer es crear dos conectores, uno se conectará en local contra el archivo .csv y el otro de tipo XMLRPC se conectará con OpenERP. A continuación definiremos los componentes que almacenarán la información, crearemos las transiciones (una para escribir los datos en el componente final y otra para ordenar los datos) que se ejecutarán y por último lanzaremos la tarea. En el componente de OpenObject definiremos el mapeo de los campos del csv a los campos del objeto erp. Las transiciones se ejecutan de forma secuencial según se hayan definido en el .py.

El código fuente de este ejemplo:


import sys
sys.path.append('..')

import openetl
 
# Conectores
fileconnector_orange=openetl.connector.localfile('/home/carlos/Escritorio/DatosRRHHOrangeHRM.csv')

ooconnector = openetl.connector.openobject_connector('http://localhost:8069', 'testProject', 'admin', 'admin', con_type='xmlrpc')

# Componentes
csv_in1= openetl.component.input.csv_in(fileconnector_orange,name='Datos de Orange')

oo_out_employee = openetl.component.output.openobject_out(
     ooconnector,
     'hr.employee',
     {'name':'firstName'}
    )


sort1=openetl.component.transform.sort('firstName')

# Transiciones

tran1=openetl.transition(csv_in1,sort1)

tran2=openetl.transition(sort1, oo_out_employee)

# Definicion de trabajo y ejecucion
job1=openetl.job([csv_in1,sort1,oo_out_employee])
job1.run()
Para facilitar el ejemplo, he simplificado el número de campos a cargar desde el .csv, los campos con tablas relacionadas, etc. Pero la carga se puede complicar tanto como sea necesaria para que todos los datos estén migrados correctamente. En la carpeta openetl\examples hay ejemplos de todas las cosas que nos harán falta en el proceso de migrado de datos, pasando desde ejemplos con entradas y salidas múltiples (csv_in_out.py) hasta carga de datos con tablas relacionadas (m2m_into_oo.py). Este ejemplo es bastante interesante, puesto que lee usuarios y grupos de archivos csv y los carga directamente en OpenERP. También hay que destacar los ejemplos de migración de datos desde sugarcrm, facebook, gcalendar, etc.

lunes, 9 de julio de 2012

Instalando psyco para corregir warning y mejorar velocidad de ejecución python

Hoy al arrancar un proyecto (OpenERP) desde eclipse en modo debug, el sistema me ha mostrado un warning:

warning: psyco not available for speedups (the debugger will still work correctly, but a bit slower)

Buscando por internet he encontrado que psyco es un proyecto alojado en
http://psyco.sourceforge.net/psycoguide/sources.html
Por lo visto este módulo lo que hace es acelerar la ejecución del código python. No es necesario para funcionar, pero sí recomendable.

Para instalarlo en windows encontré la siguiente página (hay archivos ya compilados, pero no los he probado porque mi instalación era ubuntu 10.04).

http://www.voidspace.org.uk/python/modules.shtml#psyco

Para la instalación en linux se puede bajar el código del svn del proyecto:

svn co http://codespeak.net/svn/psyco/dist/ psyco-dist


Y realizar el típico install:
sudo python setup.py install


Según la documentación del proyecto, es necesario tener en el sistema el módulo python-dev
sudo apt-get install python-dev

En mi máquina yo tenía instalada la versión 2.6 de python y todo ha ido bien.

Enlaces recomendados:

- Página de los fuentes del proyecto:
http://psyco.sourceforge.net/psycoguide/sources.html

- Página donde encontré un poco de luz sobre el tema y los enlaces a la versión windows: http://www.insomnihack.com/?p=412
Related Posts Plugin for WordPress, Blogger...