我知道如果我按名称import(moduleName)
导入模块,那么我可以使用reload(moduleName)
重新加载
但是,我正在用Kleene星导入一堆模块:
from proj import *
在这种情况下如何重新加载?
答案 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())