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

时间:2011-04-01 17:30:38

标签: python python-import python-module

我在this useful Q&A中看到可以使用reload(whatever_module),或者在Python 3中使用imp.reload(whatever_module)

我的问题是,如果我说from whatever_module import *要导入怎么办?然后,当我使用whatever_module时,我没有reload()来引用。你们是否会因为将整个模块投入全局命名空间而对我大喊大叫? :)

8 个答案:

答案 0 :(得分:45)

我同意“不要这么做”达成共识,但是......

正确答案是:

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:4)

A

from module import *

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

reload(sys.modules['module'])

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

答案 3 :(得分:2)

更干净的答案是Catskul的好答案与Ohad Cohen使用sys.module并直接重新定义的结合:

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

实际上,执行import 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

答案 4 :(得分:1)

我发现了另一种在导入时处理重新加载模块的方法:

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

答案 5 :(得分:0)

使用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

答案 6 :(得分:0)

import re

for mod in sys.modules.values():
    if re.search('name', str(mod)):
        reload(mod)

答案 7 :(得分:0)

对于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)