强制python解释器重新加载代码模块

Dan*_*eis 22 python openerp

OpenERP python代码开发周期是编辑代码,重启服务器并测试它.重新启动服务器是必要的,因为它是使源代码重新加载到内存中的原因,但它会增加工作节奏的烦人延迟.

由于python是一种动态语言,我想知道是否有办法强制运行python解释器(应用服务器)动态重新加载代码模块,以便可以在不重新启动应用服务器的情况下测试它?

更新: 按照reload@ecatmur建议的路径,我得到了下面的代码,但它仍然无法正常工作:

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)
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 14

reload内置功能将重新加载一个模块.递归重新加载更新的包有各种解决方案; 请参阅如何在Python Interpreter中重新导入更新的包?

部分问题是需要调整现有对象以从重新加载的模块引用新类等; 重新进口做得相当好.在IPython交互式控制台中,我使用autoreload扩展,虽然它不是为在IPython之外使用而设计的.


Don*_*kby 9

更新:从v8开始,Odoo服务器提供了--auto-reload执行此操作的选项.

很好的问题,我经常想知道同样的问题.我认为您发布的代码的主要问题是它只重新加载OpenERP模块的__init__.py文件,而不是所有单个文件.ecatmurreimport推荐的模块负责这一点,在重新加载所有内容之前,我还必须取消注册模块的报告解析器和模型类.

module_reloadLaunchpad上发布了我的模块.它似乎适用于模型类,osv_memory向导和报表解析器的更改.它不适用于旧式向导,可能还有其他方案不起作用.

这是重新加载模块的方法.

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 {}
Run Code Online (Sandbox Code Playgroud)