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 框架统一调度。

相关推荐
❁满城风絮*10 小时前
Claude Code 学习总结
python·agent·claude
维克兜率天12 小时前
【维克】复合型CTA:趋势+套利的双轮驱动
python·学习方法
伞伞悦读12 小时前
【第76期】两张3行表左连接变5行:主键、validate与未匹配排查完整教程
人工智能·python
用户83562907805113 小时前
使用 Python 在 Excel 中添加和自定义迷你图
后端·python
用户83562907805113 小时前
使用 Python 在 Excel 图表中添加趋势线与回归方程
后端·python
特立独行的猫A13 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
深蓝AI13 小时前
HTTPX 超时 1 秒,接口为何还能跑 2.4 秒?
python
CyrusYiVPP13 小时前
哪个用户会再来买?RFM模型+plotly画出用户分层,数据分析实战第2期
人工智能·python
李帅51515 小时前
用 CPU 做发票识别:从 OCR 文本行到结构化明细表的 4 个硬骨头
python
happylifetree16 小时前
Python79:核心语法-面向对象基础-实例方法
python