请考虑以下内容:
a.py
foo = 1
b.py
bar = 2
c.py
import a
kik = 3
d.py
import a
import c
def main():
import b
main()
main()
更笼统地说,我想知道python如何处理导入的文件和函数/变量。
答案 0 :(得分:3)
a
和b
均被加载一次。导入模块时,其 content 会被缓存,因此当您再次加载相同的模块时,您不会调用导入的原始脚本,而是使用“ finder”完成的:
这可跨模块使用,因此,如果您有d.py
的导入b
,它将与c.py
中的导入绑定到相同的缓存。
一些有趣的内置模块可以帮助您了解导入过程中发生的情况:
https://docs.python.org/3/reference/import.html#importsystem
首次导入模块时,Python会搜索该模块,如果找到该模块,则会创建一个模块对象1,对其进行初始化。
值得注意的是,这里是第一个导入,所有后续导入都遵循__import__
。查找器的内部缓存存储在sys.meta_path
。
您可以利用导入系统使这些缓存无效,例如:
https://docs.python.org/3/library/importlib.html#importlib.import_module
如果要动态导入自解释程序开始执行以来创建的模块(例如,创建了Python源文件),则可能需要调用invalidate_caches()以便导入系统注意到新模块。
imp
(和importlib
py3.4 +)允许在导入后重新编译模块:
import imp
import a
imp.reload(a)
重新编译Python模块的代码并重新执行模块级代码,通过重新使用最初加载模块的加载器,定义了一组新对象,这些对象绑定到模块字典中的名称。