我在这个有用的问答中看到了可以使用的reload(whatever_module)
,或者在 Python 3 中,imp.reload(whatever_module)
.
我的问题是,如果我说from whatever_module import *
要进口怎么办?那我用的时候就没有whatever_module
参考了reload()
。你们会因为我把整个模块扔进全局命名空间而对我大喊大叫吗?:)
我在这个有用的问答中看到了可以使用的reload(whatever_module)
,或者在 Python 3 中,imp.reload(whatever_module)
.
我的问题是,如果我说from whatever_module import *
要进口怎么办?那我用的时候就没有whatever_module
参考了reload()
。你们会因为我把整个模块扔进全局命名空间而对我大喊大叫吗?:)
我同意“一般不要这样做”的共识,但是......
正确答案是:
import X
reload(X)
from X import Y # or * for that matter
永远不要使用import *
; 它破坏了可读性。
另外,请注意重新加载模块几乎没有用处。你无法预测你的程序在重新加载一个模块后最终会处于什么状态,所以这是一个很好的方法来获得难以理解的、无法重现的错误。
一个更清晰的答案是 Catskul 的好答案和 Ohad Cohen 的使用sys.module
和直接重新定义的混合:
import sys
Y = reload(sys.module["X"]).Y # reload() returns the new module
事实上,doingimport X
会创建一个新符号 ( X
),它可能会在后面的代码中重新定义,这是不必要的(而这sys
是一个通用模块,因此不应该发生这种情况)。
这里有趣的一点是,from X import Y
它不会添加X
到命名空间,而是将模块添加X
到已知模块列表 ( sys.modules
),这允许重新加载模块(并访问其新内容)。
更一般地说,如果需要更新多个导入的符号,那么像这样导入它们会更方便:
import sys
reload(sys.module["X"]) # No X symbol created!
from X import Y, Z, T
一种
from module import *
从中获取所有“导出”的对象module
并将它们绑定到模块级别(或任何你的范围是级别)的名称。您可以将模块重新加载为:
reload(sys.modules['module'])
但这对你没有任何好处:无论你的范围是什么级别的名称仍然指向旧对象。
我找到了另一种在导入时处理重新加载模块的方法,例如:
from directory.module import my_func
很高兴知道模块是如何被导入的。该模块在sys.modules
字典中搜索。如果它已经存在于 sys.modules - 该模块将不会被再次导入。
因此,如果我们想重新加载我们的模块,我们可以将其从 sys.modules 中删除并再次导入:
import sys
from directory.module import my_func
my_func('spam')
# output: 'spam'
# here I have edited my_func in module.py
my_func('spam') # same result as above
#output: 'spam'
del sys.modules[my_func.__module__]
from directory.module import my_func
my_func('spam') # new result
#output: 'spam spam spam spam spam'
如果您想在运行整个脚本时重新加载模块,您可以使用异常处理程序:
try:
del sys.modules[my_func.__module__]
except NameError as e:
print("""Can't remove module that haven't been imported.
Error: {}""".format(e))
from utils.module import my_func
..........
# code of the script here
使用导入时from whatever_module import whatever
,whatever
被视为导入模块的一部分,因此要重新加载它 - 您应该重新加载模块。但是只是重新加载你的模块,你仍然会whatever
从已经导入的模块中得到旧的whatever_module
,所以你需要重新加载(whatever_module),而不是重新加载你的模块:
# reload(whatever_module), if you imported it
reload(sys.modules['whatever_module'])
reload(sys.modules[__name__])
如果你用过from whatever_module import whatever
你也可以考虑
whatever=reload(sys.modules['whatever_module']).whatever
或者
whatever=reload(whatever_module).whatever
import re
for mod in sys.modules.values():
if re.search('name', str(mod)):
reload(mod)
对于python 3.7:
from importlib import reload #import function "reload"
import YourModule #import your any modules
reload(YourModule) #reload your module
可以从您自己的函数中调用重新加载函数
def yourFunc():
reload(YourModule)