如何重新加载使用 `from module import *` 导入的Python模块

69 投票
8 回答
43404 浏览
提问于 2025-04-16 14:54

我在这个有用的问答中看到,可以使用reload(whatever_module)或者在Python 3中使用imp.reload(whatever_module)来重新加载模块。

我想问的是,如果我用from whatever_module import *来导入模块,那我就没有whatever_module这个名字可以用来调用reload()了。你们会因为我把整个模块放进全局命名空间而骂我吗?:)

8 个回答

7

千万不要使用 import *;这样会让代码变得难以阅读。

另外,要知道重新加载模块几乎没有什么用。你无法预测在重新加载一个模块后,你的程序会变成什么状态,这样很容易导致一些难以理解、无法重现的错误。

8

一个更简洁的答案是结合了Catskul的好答案和Ohad Cohen对sys.modules的使用,以及直接重新定义的方式:

import sys
Y = reload(sys.modules["X"]).Y  # reload() returns the new module

实际上,执行import X会创建一个新的符号(X),这个符号在后面的代码中可能会被重新定义,这样做其实是多余的(而sys是一个常用的模块,所以这种情况不应该发生)。

这里有个有趣的点是,使用from X import Y并不会把X添加到命名空间中,而是把模块X添加到已知模块的列表中(sys.modules),这使得可以重新加载这个模块(并访问它的新内容)。

更一般来说,如果需要更新多个导入的符号,那么像这样导入会更方便:

import sys
reload(sys.modules["X"])  # No X symbol created!
from X import Y, Z, T
73

我同意大家的看法,通常情况下“不要这样做”,但是……

正确的答案是:

from importlib import reload
import X
reload(X)
from X import Y  # or * for that matter

撰写回答