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

2024-09-29 19:37:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个自定义包pac1pac2。I用于导入所有的模块,一个一个的导入,修改后的模块一个一个的重新加载,如下:

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)

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

^{pr2}$

但这是我能做的最好的吗?我的意思是我能一次把所有的包裹都装上吗?

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

更新2:此过程不一定是动态完成的。我只想通过将所有这些reload()融合为一个,使我的代码更加简洁。在


Tags: 模块代码fromimport批量reload动力mod1
3条回答

假设你真的需要重新加载它们,那么你的方法是最好的,因为它是显式的(显式的比隐式的好)。它清楚地表明发生了什么(特别是因为这不是正常情况)

如果您真的需要动态执行,可以尝试如下操作:

import types

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

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

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的情况下重新加载内置函数的方法:

^{pr2}$

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

你可以试试this

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

相关问题 更多 >

    热门问题