如何在Python中批量重新加载模块?

时间:2013-10-15 14:52:19

标签: python

我有2个自定义包pac1pac2。我用于导入所有模块逐个并且在更改后逐个重新加载,如下所示:

from pac1 import mod1
from pac1 import mod2
from pac1 import mod3
from pac2 import mod4
from pac2 import mod5

reload(mod1)
reload(mod2)
reload(mod3)
reload(mod4)
reload(mod5)

现在,我了解到可以批量导入模块并将代码改进为:

from pac1 import *
from pac2 import *

reload(mod1)
reload(mod2)
reload(mod3)
reload(mod4)
reload(mod5)

但这是我能做的最好的吗? 我的意思是我可以一次性重新加载所有包吗?

UPDATE1 :我不断修改这些模块。因此,在测试开始时导入它们之后,我可能需要经常重新加载修改后的模块以反映更改。这是我重新加载模块的动机。

UPDATE2 :此过程不一定是动态完成的。我只想通过将所有reload()融合到一起来使我的代码更简洁。

3 个答案:

答案 0 :(得分:1)

sys.modules中有一个全局的模块列表(事实上,这是一个词典)。如果要重新加载全局命名空间中的每个模块,请尝试以下操作:

import sys,imp
def reloader(globaldict):
    reloadkeys = set(globaldict)&set(sys.modules)
    for key in reloadkeys:
        if imp.is_builtin(key) == 0:
            reload(sys.modules[key])

reloader(locals())

或者,如果您想自己跟踪,只需创建自己的模块列表mymodules,并在导入后将每个模块附加到它。然后你可以使用循环来重新加载每个。


这是一种避免在不检查globals的情况下重新加载内置函数的方法:

import sys,imp
def reloader(globaldict):
    for key in sys.modules:
        if imp.is_builtin(key) == 0:
           reload(sys.modules[key])

此外,您可以在启动解释器后立即捕获sys.modules的状态,并使用类似的布尔操作从重新加载中排除这些状态。

答案 1 :(得分:0)

您可以尝试this

之类的内容

或者,您可以查看Werkzeug(Flask)是如何做到的,看起来它使用subprocess来调用自身,或者代码的主要部分。

答案 2 :(得分:-1)

假设您确实需要重新加载它们,那么您最好的方式就是显式(并且显式优于隐式)。它清楚地说明了什么(特别是因为这不是正常情况)

如果真的需要动态执行,您可以尝试这样的事情:

import types

for k, v in globals().items():
    if not (k.startswith('__') and k.endswith('__')):
        if isinstance(v, types.ModuleType):
            reload(v)