Python __两次调用init__;.py代码及其在包导入中的意义

Python __两次调用init__;.py代码及其在包导入中的意义,python,compilation,initialization,init,python-module,Python,Compilation,Initialization,Init,Python Module,我有一个简单的python学习项目,其中包含两个文件\uuu init\uuuuuuuuuuuuuuupy和\uuuuuuu main\uuuuuuuuuuuuuuuuupy 当我执行python-m pkg_name 它同时运行\uuuu init\uuuuuuuuuuuuupy和\uuuuuuu main\uuuuuuuuuuuuuupy 当我执行python-m pkg\u name.\uuuu init\uuuuuuu.py 它调用了两次\uuuu init\uuuuuuuuu.py 我

我有一个简单的python学习项目,其中包含两个文件
\uuu init\uuuuuuuuuuuuuuupy
\uuuuuuu main\uuuuuuuuuuuuuuuuupy
当我执行
python-m pkg_name
它同时运行
\uuuu init\uuuuuuuuuuuuupy
\uuuuuuu main\uuuuuuuuuuuuuupy

当我执行
python-m pkg\u name.\uuuu init\uuuuuuu.py
它调用了两次
\uuuu init\uuuuuuuuu.py

我想知道为什么在我调用
\uuuuu init\uuuuuuuuuuuupy
时会调用两次
\uuuuuuuuuuuuuuuuuuupy
它是否像java中的静态代码,当我们调用该类时,所有数据 在静态模式下,代码会自动触发

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

"""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')

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

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

请结帐


另外,正如前面提到的,
\uuuuu init\uuuuuu.py
会在加载包时执行。这就是为什么当您显式调用
\uuuu init\uuuuuuuuupy
时,它加载包(第一次加载),然后执行
\uuuu init\uuuuuuupy
(第二次加载)。

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

python -m module
其中,
module
是不带扩展名的模块/包的名称

  • 如果名称与脚本匹配,则对其进行字节编译并执行
  • 如果名称与带有
    \uuuuu init\uuuuuuuupy.py
    文件和
    \uuuuuuuu main\uuuuuuuuuuupy.py
    文件的目录相匹配,则该目录将被视为Python包,并首先加载。然后执行
    \uuuu main\uuuuu.py
    脚本
  • 如果名称包含点,例如:“mylib.mypkg.mymodule”,Python将浏览与点名称匹配的每个包和子包并加载它。然后执行最后一个模块(或最后一个包,其中必须包含
    \uuuuu main\uuuuuu.py
    文件)
官方文件中有(简短)说明:

你的问题 如果运行此命令:

python -m pkg_name
python -m pkg_name.__init__.py
它加载(并运行)
\uuuuu init\uuuuuuuuuuupy
\uuuuuuuu main\uuuuuuuuuuuuupy
:这是正常行为

如果运行此命令:

python -m pkg_name
python -m pkg_name.__init__.py
如果您离开“.py”扩展名,它应该会失败


如果运行,该命令将首先加载
pkg\u名称
包:首先执行
\uuuu init\uuuu.py
。然后再次运行它。

看起来像是加载包时的副本,它是
\uuuu init\uuuuuy。如果存在,则加载
文件。加载包后,您试图加载的文件(在本例中,
\uuuu init\uuuuu.py
)将被加载,因此它将运行两次。@Prajwal不是真正的重复:OP希望了解为什么它的代码会被调用两次。这是不同的。但是,我同意他应该查看这个链接。那么,这意味着
\uuuu init\uuuu
中的每个代码都将运行两次?我在里面设置了mysql连接,这是坏习惯还是对性能的影响?@TomSawyer你来晚了<代码>\uuuu init\uuuu
不会运行两次。OP再次调用它,使它运行两次。不管它是什么。我不明白,如果我把
print
放在init里面,我会看到它打印两次。如果我在其中放入一个查询,结果是相同的。这意味着它向数据库查询了两次?如果执行一个查询两次,会导致性能下降