演示:
from module1 import func1
from module1 import func2
问题:module1 是否执行了两次?这是进口的好方法吗?谢谢!
在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
模块缓存在导入系统中,因此只加载一次,除非它们被显式重新加载。当 python 尝试导入一个模块时,它首先尝试在 中找到它sys.modules
,其中包含对所有先前加载的模块的引用。这对于包也是一样的。要获得更深入的解释,我建议阅读导入机器的优秀文档。
更一般地说,Python 只加载一个模块一次,这是第一次需要它——无论是“导入表单”还是执行“需要”的普通导入语句。任何后续导入只会注意到模块已经加载。
模块初始化仅在加载时完成一次。
如果你需要刷新一个模块的内容,你可以重新加载它。在 Python 2 上,有一个 reload(m) 内置函数来重新加载模块 m。在 Python 3 中,这已移至 imp 模块和 imp.reload(m)。在 Python 3.4 中,imp 被弃用,取而代之的是一个名为“importlib”的新模块(从 3.1 开始)。重新加载模块时,初始化将再次运行。
看:
就“最佳实践”而言,我并不总是“pythonic”。我同意每个导入行一个模块上的 PEP 8 位置,但希望模块也按字母顺序列出。
我不特别喜欢“import from”语句。如果 module.func1 将在当前源代码中的某些特定功能中大量使用,我更喜欢添加:
def myfunc(*a, **k):
func1 = module.func1
... etc.
...所以很明显,在那个函数中,只有这func1
意味着module.func1
.