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 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003965 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技5 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时5 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊5 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1235 天前
2026年第38周GitHub趋势周报
python·科技·github
IZero075 天前
Jev 与 Laya
python·语言模型