从同一模块导入两件事,是模块执行两次?

时间:2013-09-24 13:26:36

标签: python

演示:

from module1 import func1
from module1 import func2

QUES: module1执行了两次吗? 这是导入的正确方法吗? THX!

3 个答案:

答案 0 :(得分:6)

SO2.py

print 'SO2 is running'
a = 'cabbage'
b = 'python-is-awesome'

SO.py

from SO2 import a
from SO2 import b

运行后者时:

SO2 is running

只有一次;)。


PEP 8好的可以:

from SO2 import a, b

答案 1 :(得分:2)

模块缓存在导入系统中,因此只加载一次,除非显式重新加载。当python尝试导入模块时,它首先尝试在sys.modules中找到它,其中包含对所有先前加载的模块的引用。对于包也是如此。有关更深入的解释,我建议您阅读导入机制的优秀documentation

答案 2 :(得分:1)

更一般地说,Python只加载一次模块,第一次需要它 - 无论是“导入表单”还是执行“需要”的普通导入语句。任何后续导入都会注意到模块已经加载。

模块初始化仅在加载时完成一次。

如果需要刷新模块的内容,可以重新加载。在Python 2上,有一个重载(m)内置函数来重新加载模块m。在Python 3中,这已被移动到imp模块和imp.reload(m)。在Python 3.4中,imp被弃用,转而使用名为“importlib”的新模块(截至3.1)。重新加载模块时,初始化将再次运行。

见:

就“最佳实践”而言,我并不总是“pythonic”。我同意每个进口生产线上一个模块的PEP 8位置,但更喜欢按字母顺序列出模块。

我不特别喜欢“从...导入”声明。如果要在当前源中的某个特定函数中使用module.func1很多,我更喜欢添加:

def myfunc(*a, **k): 
    func1 = module.func1
    ... etc.

...所以很明显仅在该函数中 func1表示module.func1