55

我在这个有用的问答中看到了可以使用的reload(whatever_module),或者在 Python 3 中,imp.reload(whatever_module).

我的问题是,如果我说from whatever_module import *要进口怎么办?那我用的时候就没有whatever_module参考了reload()。你们会因为我把整个模块扔进全局命名空间而对我大喊大叫吗?:)

4

8 回答 8

59

我同意“一般不要这样做”的共识,但是......

正确答案是:

import X
reload(X)
from X import Y  # or * for that matter
于 2012-07-30T15:27:58.583 回答
8

永远不要使用import *; 它破坏了可读性。

另外,请注意重新加载模块几乎没有用处。你无法预测你的程序在重新加载一个模块后最终会处于什么状态,所以这是一个很好的方法来获得难以理解的、无法重现的错误。

于 2011-04-01T17:42:29.750 回答
5

一个更清晰的答案是 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
于 2018-08-01T16:17:20.763 回答
4

一种

from module import *

从中获取所有“导出”的对象module并将它们绑定到模块级别(或任何你的范围是级别)的名称。您可以将模块重新加载为:

reload(sys.modules['module'])

但这对你没有任何好处:无论你的范围是什么级别的名称仍然指向旧对象。

于 2011-06-10T17:46:05.783 回答
2

我找到了另一种在导入时处理重新加载模块的方法,例如:

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
于 2019-09-22T11:34:00.890 回答
1

使用导入时from whatever_module import whateverwhatever被视为导入模块的一部分,因此要重新加载它 - 您应该重新加载模块。但是只是重新加载你的模块,你仍然会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
于 2017-08-18T22:15:25.373 回答
0
import re

for mod in sys.modules.values():
    if re.search('name', str(mod)):
        reload(mod)
于 2017-11-06T06:25:27.713 回答
-2

对于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)
于 2018-12-27T21:47:04.103 回答