关于python:为什么我必须添加一个空白的__init__.py文件来从子目录导入?

Why do I have to add a blank __init__.py file to import from subdirectories

本问题已经有最佳答案,请猛点这里访问。

我可以用空白的__init__.py文件从子目录导入。那很好。我认为python中的init文件工作起来就像一个索引文件。但我真的不明白为什么要导入__init__.py文件是空白的。__init__.py文件和导入是如何工作的?

什么必须是__init__.py文件内容?


__init__.py有两个主要功能:

  • 标记包:将目录标记为python包,将内部.py文件标记为python模块。

  • 初始化代码:顾名思义,当导入包时,__init__.py中的任何代码都会自动执行。这是运行某个包所需的初始化代码的正确位置;但是,将__init__.py文件留空是完全可以的。


如果您要从中导入的子目录中有__init__.py文件,则它是一个包。您不需要使用包,只需将子目录添加到sys.path列表中即可。然而,它们是将相关模块保持在一起的一种整洁的方式,并且通常是被鼓励的。

__init__.py文件与类中的__init__具有类似的用途,它初始化包。这样就可以为包提供属性,而__all__就是一个示例(import *的导出名称列表)。

有时不需要初始化,因此可以为空。在Lib目录的标准库子目录中是查找示例的好地方。在那里你会发现巨大的__init__.py文件,还有一些是空的。

这是否是必需的取决于Python版本。从python 3.3中,__init__.py不是必需的,并且这些包称为名称空间包,请参见pep0420。这意味着一个包可以跨越目录,但需要付出代价。不能有__init__.py初始化代码,也不能为包获得__file__属性。因此,除非您特别需要跨目录,否则最好使用常规包。