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.pyproduct.py 模块在被导入时,其顶层代码也会被执行。

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

执行顺序与注意事项

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

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

相关推荐
2601_962295991 小时前
Spark 和 Kafka 实现 Python 大规模情感分析
python·spark·kafka·情感分析·大规模处理
计算机源码社1 小时前
分享一个基于大数据的跨平台内容生态画像与互动等级分析系统,基于Hadoop+Spark的社交媒体互动数据可视化大屏分析
大数据·hadoop·python·机器学习·数据挖掘·spark·毕业设计
砚底藏山河1 小时前
行情工程实战 M01|存储选型 CSVSQLiteMySQL
java·python·金融·maven
在所不辞兄2 小时前
【零基础学智能仿真-11】CatBoost——让材料类型和边界条件参与力学预测
人工智能·python·深度学习·神经网络·机器学习·工程技术
2601_962097692 小时前
python的多线程编程之锁
python·多线程·同步·事件·
2 小时前
Python 图片处理:裁剪缩放至300×200,格式JPG/PNG/GIF,控制大小≤100KB
linux·前端·python
2601_962294612 小时前
Python工具软件开发:借助InsCode AI IDE开启智能编程新时代
ide·python·ai·开发工具·智能化编程
2601_962097364 小时前
GraphQL,Grafana和Dash
python·grafana·数据可视化·graphql·dash
benchmark_cc11 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash