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

14 浏览
0 Comments

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

OpenERP的Python代码开发周期是编辑代码、重新启动服务器并进行测试。\n重新启动服务器是必要的,因为这样可以将源代码重新加载到内存中,但它会给工作节奏带来烦人的延迟。\n由于Python是一种如此动态的语言,我想知道是否有一种方法可以强制运行中的Python解释器(应用服务器)在运行时重新加载代码模块,以便可以在不重新启动应用服务器的情况下进行测试?\n更新:\n按照@ecatmur提出的reload方法,我写了下面的代码,但仍然无法正常工作:\n

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)

0
0 Comments

问题出现的原因:需要强制Python解释器重新加载一个代码模块。

解决方法:使用ipython的deepreload模块,该模块可以在ipython REPL之外使用。

在此之前,我们需要了解一下什么是代码模块。在Python中,代码模块是指一个包含了一组函数、变量和类的文件。模块是组织Python代码的一种方式,可以将相关的代码放在一个模块中,以便于重用和维护。

有时候,在开发过程中,我们可能需要对一个已经加载的模块进行修改,并希望立即看到修改后的效果。然而,默认情况下,Python解释器在加载一个模块后,会将其缓存起来,以提高程序的性能。这意味着,如果我们对一个模块进行了修改,Python解释器并不会立即加载修改后的代码,而是继续使用缓存中的旧代码。因此,我们需要一种方法来强制Python解释器重新加载一个模块。

在ipython中,有一个名为deepreload的模块,可以帮助我们解决这个问题。deepreload模块提供了一种重新加载模块的方法,即使模块已经被缓存。这意味着,我们可以使用deepreload模块来强制Python解释器重新加载一个模块,并看到修改后的效果。

要使用deepreload模块,我们首先需要安装ipython。ipython是一个增强版的Python解释器,提供了许多有用的功能,包括强制重新加载模块的能力。

安装ipython后,我们可以在终端或命令提示符中输入ipython命令来启动ipython REPL。然后,我们可以使用以下命令来重新加载模块:

import IPython.lib.deepreload
IPython.lib.deepreload.reload(module_name)

在上面的代码中,module_name是要重新加载的模块的名称。通过调用deepreload.reload函数,并传递模块名称作为参数,我们可以强制Python解释器重新加载指定的模块。

需要注意的是,deepreload模块只能重新加载已经被Python解释器加载过的模块。如果一个模块从未被加载过,那么deepreload模块将无法重新加载它。

总结一下,当我们需要强制Python解释器重新加载一个已经加载过的模块时,可以使用ipython的deepreload模块。通过调用deepreload.reload函数,并传递模块名称作为参数,我们可以实现重新加载模块的目的。这样,我们就可以立即看到对模块的修改所产生的效果。

0
0 Comments

在Python中,当我们在运行时修改了代码模块后,通常需要重新加载模块才能使修改生效。然而,有时候我们希望强制Python解释器重新加载一个代码模块,以便立即看到修改的效果。下面是一个解决这个问题的方法:

首先,我们需要注意到一个问题,即只重新加载OpenERP模块的`__init__.py`文件并不能重新加载所有的文件。为了解决这个问题,我们可以使用`reimport`模块来重新加载所有文件。

此外,我们还需要在重新加载模块之前取消注册模块的报表解析器和模型类。

下面是一个实现重新加载模块的方法的示例代码:

def button_reload(self, cr, uid, ids, context=None):
    for module_record in self.browse(cr, uid, ids, context=context):
        # 移除该模块的所有报表解析器
        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)
        # 移除该模块的所有模型类
        MetaModel.module_to_models[module_record.name] = []                    
        # 重新加载OpenERP模块目录下的所有Python模块
        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 {}

需要注意的是,该方法在OpenERP v8中已经被实现了,并且通过`--auto-reload`选项可以自动重新加载模块。

以上就是解决强制Python解释器重新加载代码模块的问题的方法,通过移除报表解析器和模型类,并重新加载Python模块来实现。这个方法可以在大部分情况下正常工作,但对于旧式的向导可能无法生效。

0
0 Comments

问题的原因是:当我们在Python解释器中修改了一个模块的代码后,重新导入模块时,并不会真正地重新加载模块,而是使用了之前已经加载的模块。这意味着,我们对模块所做的修改将不会生效。

解决方法有以下几种:

1. 使用内置函数`reload`来重新加载单个模块。可以通过调用`reload(module_name)`来重新加载名为`module_name`的模块。这将强制解释器重新加载模块并应用我们对代码所做的修改。

2. 对于需要递归重新加载更新的包,可以使用不同的解决方案。可以参考stackoverflow上的相关问题:How to re import an updated package while in Python Interpreter?

3. 使用第三方库`reimport`来解决问题。`reimport`库可以在重新加载模块时,调整现有对象以引用重新加载的模块中的新类等。

4. 对于在IPython交互式控制台中使用的情况,可以使用`autoreload`扩展。`autoreload`扩展可以自动重新加载已修改的模块,但它并不适用于IPython之外的其他环境。

总结起来,当我们在Python解释器中修改了一个模块的代码后,想要强制解释器重新加载模块并应用修改,可以使用内置函数`reload`、第三方库`reimport`或者在IPython交互式控制台中使用`autoreload`扩展。根据具体的使用场景和需求,选择适合的解决方法来解决问题。

0