para paquetes mac librerias libreria instalar descargar python openerp

paquetes - instalar pip python windows



Forzar al intérprete de Python a recargar un módulo de código (5)

El ciclo de desarrollo del código Python de OpenERP consiste en editar su código, reiniciar el servidor y probarlo. Es necesario reiniciar el servidor, porque es lo que hace que su código fuente se vuelva a cargar en la memoria, pero agrega un retraso molesto en su ritmo de trabajo.

Dado que Python es un lenguaje tan dinámico, me pregunto si hay una manera de forzar a un intérprete de Python en ejecución (el servidor de aplicaciones) a que se cargue al vuelo un módulo de código, de modo que pueda probarse sin reiniciar el servidor de aplicaciones.

Actualización: Siguiendo la ruta de reload sugerida por @ecatmur, obtuve el siguiente código, pero aún no funciona:

class module(osv.osv): _inherit = "ir.module.module" def action_reload(self, cr, uid, ids, context=None): for obj in self.browse(cr, uid, ids, context=context): modulename = ''openerp.addons.'' + obj.name tmp = __import__(modulename) pycfile = tmp.__file__ modulepath = string.replace(pycfile, ".pyc", ".py") code=open(modulepath, ''rU'').read() compile(code, modulename, "exec") execfile(modulepath) reload( sys.modules[modulename] ) openerp.modules.registry.RegistryManager.delete(cr.dbname) openerp.modules.registry.RegistryManager.new(cr.dbname)


La función incorporada de recarga recargará un solo módulo. Existen varias soluciones para recursivamente recargar paquetes actualizados; vea ¿Cómo volver a importar un paquete actualizado mientras está en el intérprete de Python?

Parte del problema es que los objetos existentes deben ajustarse para hacer referencia a las nuevas clases, etc., de los módulos recargados; reimport hace esto razonablemente bien. En la consola interactiva de IPython, uso la extensión de autoreload , aunque no está diseñada para su uso fuera de IPython.


Si solo estás haciendo desarrollo, entonces recargar está bien, pero si estás implementado, debes evitar tales trucos, ya que nunca funcionarán el 100% del tiempo. Siempre habrá algunas sutilezas, donde los cambios no se propagarán. Por ejemplo, si algún código copia un objeto en lugar de usar solo referencias a él, seguirá siendo el mismo después de la recarga. A la inversa, si una referencia no se propaga hacia adelante correctamente, entonces una comparación fallará cuando se espera que funcione, porque uno de los objetos será del módulo antiguo "no publicado". El único método 100% seguro de disparo sería recargar todo, que es esencialmente lo que es un reinicio del servidor.

Incluso si solo estás haciendo desarrollo, ocasionalmente encontrarás errores falsos que son solo efectos secundarios de una recarga incompleta. Si no se te ocurre intentar un reinicio limpio, puedes pasar mucho tiempo intentando rastrear el error fantasma. Así que si terminas haciendo esto, mantenlo en tu mente.



la función de recarga incorporada recarga un módulo o un paquete. Sin embargo, en el contexto de OpenERP, necesita un poco más, ya que la recarga de un complemento OpenERP requiere el procesamiento de los archivos XML, etc. Pero estoy de acuerdo en que tener esto en OpenERP sería bueno.


ACTUALIZACIÓN: desde v8, el servidor Odoo proporciona una opción --auto-reload para realizar esto.

Excelente pregunta, muchas veces me he preguntado lo mismo. Creo que el principal problema con el código que publicaste es que solo vuelve a cargar el archivo __init__.py del módulo OpenERP, no todos los archivos individuales. El módulo de reimport recomendado por ecatmur se encarga de eso, y también tuve que anular el registro de los analizadores de informes del módulo y las clases de modelo antes de volver a cargar todo.

He publicado mi módulo module_reload en Launchpad . Parece funcionar para los cambios en las clases de modelos, los asistentes de osv_memory y los analizadores de informes. No funciona para los asistentes de estilo antiguo, y puede haber otros escenarios que no funcionen.

Aquí está el método que recarga el módulo.

def button_reload(self, cr, uid, ids, context=None): for module_record in self.browse(cr, uid, ids, context=context): #Remove any report parsers registered for this module. module_path = ''addons/'' + module_record.name for service_name, service in Service._services.items(): template = getattr(service, ''tmpl'', '''') if template.startswith(module_path): Service.remove(service_name) #Remove any model classes registered for this module MetaModel.module_to_models[module_record.name] = [] #Reload all Python modules from the OpenERP module''s directory. modulename = ''openerp.addons.'' + module_record.name root = __import__(modulename) module = getattr(root.addons, module_record.name) reimport(module) RegistryManager.delete(cr.dbname) RegistryManager.new(cr.dbname) return {}