Entradas populares

jueves, 1 de noviembre de 2012

generando pipelines desde ficheros de configuracion

Voy a comentar algo sobre el proyecto en que estoy ahora desarrollando en Blue bolt, los primeros dias me explicaron la idea que tenian ellos para publicacion de assets o mejor dicho de publicacion de bundles (grupos de assets), al cabo de unos dias me dijeron que me pusiese a desarrollar la idea y prepare una prueba de concepto que funcionaba para explicar mi idea y como se ajustaba a la suya, el problema es que funciono y ahora soy el encargado de todo el proyecto que comprende practicamente todo el pipeline de la empresa  :).

La idea base es que en vez de tener varios scripts que cada uno hiciese todo el proceso de una sola vez, tener una serie de scripts simples que pudiesemos enlazarlos entre ellos y nos generasen los procesos, en cierto modo seria tener un sistema nodal de pipeline seteado por unos archivos de configuracion, cada uno de esos nodos haria funciones simples, lanzar un render, hablar con la base de datos, copiar archivos, y unos ficheros de descripcion del trabajo definirian las conexiones entre estos trabajos

Para poder hacerlo de un modo flexible el principal problema era como pasar unos datos que seteabamos en la definicion a variables en cada uno de los nodos, o como se pasaban datos de un nodo a otro, al final gracias a una de las caracteristicas de python fue relativamente sencillo, y es la introspeccion, gracias a ella podemos saber que variables tenemos en una clase, y facilmente leer su valor y pasarselo a otra clase.

Por ejemplo: suponer que tenemos dos clases,la clase renderMaya que hemos llamado 'render1' y la clase mkQuicktime que hemos llamado 'quicktime' y queremos que primero renderice maya para luego crear un quicktime con esas imagenes,  'render1' tiene una variable outputPath que es la que usa para setear el trabajo en la granja, desde la definicion le decimos que al nodo 'quicktime', la variable 'inputSequence' tiene el valor  '^/render1/outputPath', lo hacemos con

setatt(self,'quicktime','^/render1/outputPath')

asi hemos creado en nuestra clase una variable y le hemos seteado un valor a partir de dos strings

Para empezar se ejecuta primero el nodo 'render1' y cuando va a ejecutar el nodo 'quicktime' lo primero que le decimos es que resuelva las dependencias, para ello recorremos todas las variables de la clase que se encuentran en el diccionario __dict__ y vemos cuales son string y comienzan con '^', cogemos los valores que nos dan de nodo y variable, el script busca en todas las clases una que tenga la variable name con valor 'render1', y mira a ver si en esa clase existe la variable 'outputPath' con

hasattr(nodo, atributo)

si existe lo que hacemos es recoger su valor con getattr

value=getattr (clase, 'outputPath')

y lo seteamos en la clase actual

setattr(self,'quicktime',value)

De este modo tenemos acceso a TODAS las variables de las distintas clases que conforman nuestro arbol de dependencias, asi podemos setear los valores de cada modulo ya sea con un valor fijo o relativo a la salida de otro modulo como puede ser la version que estamos creando o el path a los fotogramas renderizados

Otra de los puntos fuertes de este proyecto es que creamos todos los nodos llamando a la misma clase y dependiendo del parametro 'type' que le pasemos nos devuelve una u otro, por ejemplo la llamamos aqui nodoBase, leemos el tipo y el nombre desde la definicion  y creamos el nodo 'render1' del modo

nodo=nodoBase(name='render1',nType='renderMaya')

si le hacemos un type a 'nodo' lo que nos devolvera sera una clase renderMaya, no una clase nodoBase, esto es usando el metodo __new__ que comente hace unas cuantas entradas

con estas dos aproximaciones podemos crear y conectar nodos de un modo muy sencillo a partir de una fichero de configuracion, y por lo tanto generar archivos de configuracion para generar trabajos complejos  de un modo bastante facil y sobre todo muy reutilizable


No hay comentarios:

Publicar un comentario