我有2个自定义包pac1
和pac2
。我用于导入所有模块逐个并且在更改后逐个重新加载,如下所示:
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()
融合到一起来使我的代码更简洁。
答案 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)
答案 2 :(得分:-1)
假设您确实需要重新加载它们,那么您最好的方式就是显式(并且显式优于隐式)。它清楚地说明了什么(特别是因为这不是正常情况)
如果真的需要动态执行,您可以尝试这样的事情:
import types
for k, v in globals().items():
if not (k.startswith('__') and k.endswith('__')):
if isinstance(v, types.ModuleType):
reload(v)