Python何时执行__init__.py文件,执行频率如何?

24

有人能帮忙澄清一下吗?在使用import命令时,各个包目录中的__init__.py文件是在哪个时刻执行的?

  1. 每个被包含的模块执行时?
  2. 只在第一次import命令时执行一次?
  3. 每次import命令都执行?

4
为什么不试试呢?在其中一个地方加上print语句,然后试试看。 - DaveBensonPhillips
2
当然,好主意,谢谢!我并不想争论,但我的问题与Python 2.7或3.4规范有关,Python应该做什么。没有它们,怎么知道什么是正确或错误的行为呢? - Sharphawk
这个回答解决了你的问题吗?init.py中的代码何时运行?__ - fedorqui
1个回答

20

它在第一次模块导入时进行评估。在下一次导入时,解释器检测到模块已经被加载,并简单地返回对其的引用。没有必要重新执行代码。

引用导入系统

关于缓存模块:

在导入搜索期间首先检查的位置是sys.modules。此映射作为所有先前导入的模块(包括中间路径)的缓存。因此,如果先前导入了foo.bar.baz,则sys.modules将包含foo、foo.bar和foo.bar.baz的条目。每个键将其值作为相应的模块对象。

在导入期间,模块名称在sys.modules中查找,如果存在,则相关联的值是满足导入的模块,进程完成。但是,如果该值为None,则会引发ImportError。如果模块名称丢失,则Python将继续搜索该模块。

在导入时执行__init__

Python定义了两种类型的包,常规包和命名空间包。 常规包是传统的Python 3.2及更早版本中存在的包。 常规包通常被实现为包含一个__init__.py文件的目录。当导入常规包时,将隐式执行此__init__.py文件,并将其定义的对象绑定到包名称空间中的名称。 __init__.py文件可以包含与任何其他模块相同的Python代码,当它被导入时,Python会向模块添加一些附加属性。

3
如果我只导入包中的一个模块(而不是整个包),__init__.py 会被执行吗? - Henry
1
@Henry,你的问题在这里得到了解答:[https://dev59.com/2l4d5IYBdhLWcg3wHPg9?noredirect=1&lq=1] - crobar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接