如何重新加载使用`从模块导入*`导入的Python模块
我在这个有用的问答中看到,可以使用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 *
; 它破坏了可读性。
另外,请注意,重新加载模块几乎是没有用的。 你不能预测你的程序在重新加载模块之后会以什么状态出现,所以这是一个很好的方法来获得难以理解的,不可再生的错误。
一个
from module import *
从module
获取所有“导出”对象,并将它们绑定到模块级别(或任何范围内的级别)名称。 您可以重新加载模块:
reload(sys.modules['module'])
但是这对你没有任何好处:无论你的范围是什么级别的名字仍然指向旧的对象。
当from whatever_module import whatever
使用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)