4

我有 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()为一个来使我的代码更简洁。

4

3 回答 3

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,并使用类似的布尔操作从重新加载中排除这些状态。

于 2013-10-15T15:09:52.177 回答
0

你可以试试这样的

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

于 2013-10-15T15:01:44.247 回答
-1

Assuming you really need to reload them, the way you are doing it is best because it is explicit (and explicit is better than implicit). It makes it clear whats going on (especially since this is not a normal situation)

If you really need to do it dynamically, you can try something like this:

import types

for k, v in globals().items():
    if not (k.startswith('__') and k.endswith('__')):
        if isinstance(v, types.ModuleType):
            reload(v)
于 2013-10-15T15:02:57.673 回答