Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中批量重新加载模块?_Python - Fatal编程技术网

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

如何在Python中批量重新加载模块?,python,Python,我有两个自定义包pac1和pac2。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) 现在,我了解到我可以批量导入模块,并改

我有两个自定义包
pac1
pac2
。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)
现在,我了解到我可以批量导入模块,并改进代码以:

from pac1 import *
from pac2 import *

reload(mod1)
reload(mod2)
reload(mod3)
reload(mod4)
reload(mod5)
但这是我能做的最好的了吗我的意思是我可以一次性重新加载所有软件包吗?

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


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

您可以尝试以下方法

或者,您可以查看(Flask)是如何实现的,它看起来像是使用
子流程来调用自己,或者是调用代码的主要部分。

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

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

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
,并在导入模块后将每个模块附加到该列表中。然后可以使用循环重新加载每个循环


这里有一种方法可以避免在不检查全局文件的情况下重新加载内置文件:

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


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

为什么您需要在导入后立即重新加载它们?@DanielB,因为我一直在修改它们。请参阅Edited。如果代码只是为了在测试期间重新加载,那么它是否简洁真的很重要吗?如果你想让它更整洁,你可以把它放在每个
pac*
文件中。有一个全局模块列表。因为有一个全局模块列表。@Marcin我知道,
sys.modules
,但他只想重新加载刚导入的模块。试图避免重新加载所有内容。@Marcin,如果文件本身被导入,也可以避免无限循环。我认为保存一个导入模块的列表是最好的办法,从sys.modules重新加载所有模块可能太麻烦了-例如,我有大约300个模块,想象一下,在sys.modules.Link-only中,我专门提供了一些代码,这些代码并没有重新加载每个模块。请注意,仅链接的答案不是好答案。如果链接变暗,那么答案就没用了。请在这里包括答案的基本部分。@ChrisF通常我也不赞成这些。。。在这种特殊情况下,我假设如果Github变暗,我们会遇到更大的问题;)(我想与之相反的论点是,光之子完全有可能删除他的分支……)我确实试图在我的回答中包含主要要点。