Python中__init__.py文件的执行时间

__init__.py 文件并不会在项目启动时全部自动执行,它的执行遵循 Python 标准的包导入机制。

核心规则:只有被导入的包,其 __init__.py 才会执行

__init__.py 文件是 Python 中标识一个目录为"包(Package)"的标志。它的执行遵循两条核心规则:

  1. 触发条件 :只有当包含该 __init__.py 文件的包(Package)被导入时,这个文件才会被执行。这里的"导入"包括直接导入该包,或导入该包下的任何子模块、子包。
  2. 执行次数 :每个包的 __init__.py 文件在整个 Python 解释器会话期间,只会被执行一次 。首次导入后,模块会被缓存到 sys.modules 中。后续的导入操作会直接使用缓存,而不会重复执行。

FastAPI 项目中的具体表现

在 FastAPI 项目中,这个机制体现在应用的启动流程上:

  1. 启动入口 :当你使用 uvicorn main:app 或类似命令启动应用时,Python 解释器会从入口文件(例如 main.py)开始执行。
  2. 执行导入 :解释器会自上而下 执行 main.py 中的代码。当遇到 import 语句时,便会去加载对应的模块或包。
  3. 触发执行 :这个加载过程会触发相关包的 __init__.py 文件执行。例如:
    • 如果 main.py 中有 from .routers import user,那么 routers 包(即 routers/__init__.py)会被执行。
    • 如果 routers/__init__.py 中又有 from . import user, product,那么 user.py 和 product.py 模块在被导入时,其顶层代码也会被执行。

因此,__init__.py 的执行是"按需"且"一次"的 。那些从未被任何代码导入的包,其 __init__.py 文件在整个应用生命周期中都不会被执行。

执行顺序与注意事项

  • 顺序是深度优先 :当你导入一个深层模块如 import a.b.c 时,Python 会依次执行 a/__init__.py、a/b/__init__.py,最后才加载 a/b/c.py。
  • 避免在顶层执行重操作 :由于 __init__.py 在导入时即执行,应避免在其中直接进行数据库连接、耗时计算等操作,以免阻塞应用启动。推荐将此类操作放在函数或 FastAPI 的 lifespan 事件中。
  • 小心循环导入:多个模块相互导入容易导致循环依赖,从而引发错误。应合理设计代码结构来避免。

总结来说,__init__.py 的执行是 Python 导入机制的一部分,完全取决于代码中的 import 语句,而不是由 FastAPI 框架统一调度。

相关推荐
全栈弄潮儿5 小时前
Python实战第7期:字典与集合
后端·python·编程语言
2603_965148116 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya6 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
把我格子衫拿来6 小时前
Dice 很高就够了吗?分割评价中的 IoU、表面距离与 HD95
python·图像分割·模型评估·医学影像·dice
曲径海盗7 小时前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门
Data_Journal7 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
我命由我123458 小时前
智能助手通用问答边界
人工智能·python·学习·ai·学习方法·ai编程·智能体
Angeldream1238 小时前
第 4 章 医学影像预处理
图像处理·人工智能·python·医学影像·医学影像处理
Web3&Basketball8 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
把我格子衫拿来8 小时前
医学影像重采样:spacing 改了,为什么模型位置也跟着错了?
python·dicom·医学影像·simpleitk·重采样