首页 > 解决方案 > 可执行目录中的Python执行顺序

问题描述

我正在尝试创建一个可执行目录。我的一个子包中的init .py 中的代码似乎在根目录中的主.py 文件之前执行。这是为什么?

标签: python-3.x

解决方案


由于您没有在您的问题中描述任何特定的包结构,为了举例,我所有人都想出一个。假设您的包结构如下所示:

package/
├── __init__.py
├── __main__.py
└── subpackage
    ├── __init__.py
    └── submodule.py

并且package/__main__.py包含

print("before import in", __name__)

import package.subpackage.submodule

print("after import in", __name__)

而文件package/__init__.py,package/subpackage/__init__.pypackage/subpackage/submodule.py都包含

print(__name__)

(请注意,这__name__只是一个保存当前模块名称的精美全局变量)。

如果我们尝试使用命令运行我们的包

$ python3 -m package

我们得到以下输出

package
before import in __main__
package.subpackage
package.subpackage.submodule
after import in __main__

这告诉我们,该包的顶级__init__模块是解释器首先加载的,然后是__main__. 在运行的过程中__main__,我们遇到了一个import语句,它导致解释器暂时停止执行以加载所需的模块。加载模块时,Python 会检查每个中间包是否已经加载。任何尚未加载的包都将首先加载,因此导入package.subpackage.submodule会导致package/subpackage/__init__.py运行,然后是package/subpackage/submodule.py. 只有当这一切都完成后,控制权才会返回__main__

在您的包中,您的子包本身__init__.py没有执行。相反,您的主模块(可能)从子包中导入模块,这会导致加载子包的模块,如上所示。 __main__.py__init__


推荐阅读