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

11 浏览
0 Comments

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

我在这个有用的问答帖子中看到,可以使用reload(whatever_module)或在Python 3中使用imp.reload(whatever_module)。\n我的问题是,如果我使用from whatever_module import *进行导入,那么当我使用reload()时就没有whatever_module可以引用了。你们会因为我将整个模块放入全局命名空间而责备我吗? 🙂

0
0 Comments

Python中的模块重新加载问题及解决方法

在Python中,如果我们使用from module import *这样的方式导入模块,那么当我们想要重新加载这个模块时会遇到一些问题。下面是一个关于如何重新加载这种导入方式的问题的解决方法:

解决方法:

一种解决方法是结合了Catskul和Ohad Cohen的方法,使用sys.modules和直接重新定义reload

import sys
Y = reload(sys.modules["X"]).Y  # reload()返回新的模块

事实上,当我们使用import X导入模块时,会创建一个新的符号(即X),而这个符号在随后的代码中可能会被重新定义,这是不必要的(而sys是一个常用的模块,所以不会发生这种情况)。

有趣的是,from X import Y并不是将X添加到命名空间中,而是将模块X添加到已知模块列表sys.modules中,这样就可以重新加载模块(并访问其新内容)。

更一般地,如果多个导入的符号需要更新,那么可以更方便地像下面这样导入它们:

import sys
reload(sys.modules["X"])  # 不会创建X符号!
from X import Y, Z, T

需要注意的是,sys.module应该是sys.modules。我试图进行编辑,但只有3个字符...

我试图回应“已修复,谢谢!”,但只有14个字符,无法被接受。 🙂

0
0 Comments

问题的原因是使用from module import *语句导入模块会破坏可读性,而且重新加载模块几乎没有什么用处。重新加载模块后,程序的状态很难预测,容易导致难以理解和无法重现的错误。然而,在交互模式下重新加载模块是有用的,因为可以及时更新模块而无需退出Python环境。

解决方法是避免使用import *语句,可以使用from somepackage import foo as f这样的形式来导入模块,并使用f.yourObjects来引用其中的对象。如果需要在交互模式下运行所有的设置代码,可以使用python -i foo.py命令来运行脚本。如果想要重新加载一个已经使用import module as mod导入的模块,可以使用reload(mod)函数来实现。

另外,需要注意的是数学函数有着众所周知的名称,因此可以正式地使用from math import *语句来导入数学模块。

0
0 Comments

问题的原因是当使用`from module import *`方式导入模块时,无法使用`reload`函数重新加载模块。解决方法是使用`reload`函数重新加载模块时,直接使用模块的名称,或者使用模块的别名。

具体的解决方法如下:

from importlib import reload
import X
reload(X)
from X import Y  # 或者使用 * 导入

如果想要更加规范的解决方法,可以使用`reload(sys.modules["X"])`来重新加载模块。这样做可能需要将`sys`模块添加到命名空间中,但是由于`sys`模块是一个常用模块,不会和其他模块冲突(而`X`可能会被新增的`import X`语句覆盖)。

如果导入的模块使用了别名,可以在`reload`函数中使用别名。例如,对于`import XX as X`,可以使用`reload(X)`重新加载模块。

需要注意的是,当从一个包的模块中导入对象时(例如`from package.module import object`),这种方法似乎不起作用。

对于Python 3,特别是3.4及以上版本,需要添加`from importlib import reload`语句来导入`reload`函数。很遗憾,编辑该答案会出现错误信息“Suggested edit queue is full”。

0