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

时间:2014-07-21 11:14:58

标签: python

我知道如果我按名称import(moduleName)导入模块,那么我可以使用reload(moduleName)重新加载

但是,我正在用Kleene星导入一堆模块:

from proj import *

在这种情况下如何重新加载?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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())