__init__.py代码调用两次,其重要性与包导入

时间:2017-01-02 05:45:07

标签: python compilation initialization init python-module

我有一个简单的python项目来学习两个文件__init__.py__main__.py 当我执行python -m pkg_name时 它同时运行__init__.py__main__.py

执行python -m pkg_name.__init__.py时 它会两次调用__init__.py

我想知道为什么__init__.py在我拨打__init__.py时被调用两次 它就像java中的静态代码,当我们调用类的所有数据时 在静态代码中自动触发。

__init__.py在python中的相关性以及在导入/加载或调用包进行处理时执行它的好处。 请帮助我更好地理解这些概念。

"""Run a sequence of programs, testing python code __main__ variable

Each program (except the first) receives standard output of the
previous program on its standard input, by default. There are several
alternate ways of passing data between programs.

"""

def _launch():
    print('Pipeline Launched')


if __name__ == '__main__':
    print('This module is running as the main module!')
    _launch()
> __init__.py

"""This is the __init__.py file of pipleline package

Used for testing the import statements.


"""

print(__name__)
print('This is the __init__.py file of pipleline package')
print('Exiting __init__ of pipeline package after all initialization')

2 个答案:

答案 0 :(得分:2)

以下命令用于执行Python模块或包:

python -m module

其中module是模块/包的名称没有 .py扩展名。

  • 如果名称与脚本匹配,则进行字节编译并执行,
  • 如果名称与具有__init__.py文件和__main__.py文件的目录匹配,则该目录被视为Python包并首先加载。然后执行__main__.py脚本。
  • 如果名称包含点,例如:" mylib.mypkg.mymodule",Python浏览与点名称匹配的每个包和子包并加载它。然后它执行最后一个模块(或最后一个必须包含__main__.py文件的包。

(简短)描述在官方文档中完成:29.4. main — Top-level script environment

您的问题

如果您运行此命令:

python -m pkg_name

它加载(并运行)__init__.py__main__.py:这是正常行为。

如果您运行此命令:

python -m pkg_name.__init__.py

如果你离开" .py"它应该会失败扩展

如果它运行,该命令首先加载pkg_name包:它首先执行__init__.py。然后再次运行它。

答案 1 :(得分:0)

它用于将文件夹定义为包,其中包含所需的模块和资源。

您可以将is用作空文件或添加有关包的文档或设置模块的初始条件。

请查看python documentation

此外,正如Natecat所述,只要您加载包,就会执行__init__.py。这就是为什么当你明确地调用__init__.py时,它会加载包(第一次加载)然后执行__init__.py(第二次加载)。