python-3.x - 可执行目录中的Python执行顺序
问题描述
我正在尝试创建一个可执行目录。我的一个子包中的init .py 中的代码似乎在根目录中的主.py 文件之前执行。这是为什么?
解决方案
由于您没有在您的问题中描述任何特定的包结构,为了举例,我所有人都想出一个。假设您的包结构如下所示:
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__.py
和package/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__
推荐阅读
- amazon-web-services - 亚马逊 ec2 如何使用负载均衡器将域名路由到实例?
- javascript - 如何使用 d3 在 JavaScript 中正确地将函数作为参数提供
- c - 有人知道 SOCKET.H 的 Watcom .lib 文件吗?
- javascript - 如果 axios post 有多个输入,如何仅将一个值的邮件发送到后端
- mysql - 在 MySQL 中使用 CAST() 将 VARCHAR 转换为 CHAR,但最终结果仍然是 VARCHAR 而不是 CHAR
- python - PyTorch 模型在新机器上第一次加载需要太多时间
- docker - docker no_proxy不生效
- android - KitKat 服务图标上的红色方块
- postgresql - Flyway 迁移成功,但 postgres 说没有使用 \dt 的关系
- javascript - 如何将项目从 1 个列表移动到 HTML 中的另一个列表