Python:如何重新加载使用*导入的模块

9 投票
2 回答
1729 浏览
提问于 2025-04-18 14:05

我知道如果我通过名字导入一个模块,比如用 import(moduleName),那么我可以用 reload(moduleName) 来重新加载它。

但是,我现在是用一个 Kleene 星号导入一堆模块:

from proj import *

在这种情况下,我该怎么重新加载它们呢?

2 个回答

0

这是一个复杂而让人困惑的问题。我提供的方法会重新加载模块,并在特定的环境中刷新变量。不过,如果你有多个模块使用了星号导入(也就是一次性导入所有内容),那么这些模块会保留它们原来的值,而不是更新。这种情况下,这个方法就会失效。一般来说,重新加载模块并不是一个好习惯,除非你在使用REPL(交互式编程环境)。模块不应该是动态的,你应该考虑其他方法来提供你需要的更新。

import sys

def reload_starred(module_name, context):
    if context in sys.modules:
        context = vars(sys.modules[context])
    module = sys.modules[module_name]

    for name in get_public_module_variables(module):
        try:
            del context[name]
        except KeyError:
            pass

    module = reload(module)

    context.update(get_public_module_variables(module))

def get_public_module_variables(module):
    if hasattr(module, "__all__"):
        return dict((k,v) for (k,v) in vars(module).items() 
                if k in module.__all__)
    else:
        return dict((k,v) for (k,v) in vars(module).items() 
                if not k.startswith("_"))

用法:

reload_starred("my_module", __name__)
reload_starred("my_module", globals())
reload_starred("my_module", "another_module")
def function():
    from my_module import *
    ...
    reload_starred("my_module", locals())
1

我觉得有办法重新加载所有的Python模块。下面是Python 2.7的代码示例:与其用星号导入整个数学模块,不如只导入你需要的部分。

from math import *
from sys import *

Alfa = modules.keys()
modules.clear()

for elem in Alfa:
    str = 'from '+elem+' import *'
    try:     
        exec(str)     
    except: 
        pass

撰写回答