如何在Python代码中从pyproject.toml获取应用版本并实现/version路由
实现Flask API的/version路由返回应用版本
先搞懂你疑惑的__package__
你看到的示例里的__package__是Python内置变量,指当前代码所在的包名,但你的项目结构里wsgi.py是根目录的主文件,直接用它会报错——你需要把它替换成pyproject.toml里[tool.poetry]下的name字段值,比如你的pyproject.toml写的是name = "my-flask-api",就改成importlib.metadata.version("my-flask-api")。
具体实现步骤
1. 确认pyproject.toml里的配置
打开你的pyproject.toml,找到[tool.poetry]区块,记下name和version:
[tool.poetry] name = "your-api-project-name" # 这是你要填入importlib的包名 version = "0.1.0" # 最终要返回的版本号
2. 修改wsgi.py添加路由
直接在wsgi.py里写以下代码(或整合进你原有代码):
from flask import Flask import importlib.metadata app = Flask(__name__) # 获取版本号的逻辑 try: # 优先从已安装的包元数据读取(生产环境用poetry install后生效) app_version = importlib.metadata.version("your-api-project-name") except importlib.metadata.PackageNotFoundError: # 本地开发时,若包未安装,直接读取pyproject.toml文件 import tomllib with open("pyproject.toml", "rb") as f: pyproject_content = tomllib.load(f) app_version = pyproject_content["tool.poetry"]["version"] # 添加/version路由 @app.route("/version") def return_version(): return {"version": app_version} if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
3. 测试路由
启动服务后,访问http://localhost:5000/version,就能看到返回的JSON:
{"version": "0.1.0"}
补充说明
- 用
importlib.metadata.version是标准做法,适合生产环境,因为Poetry安装包时会把版本信息写入环境的包元数据。 - 加上异常处理是为了兼容本地开发场景——如果你没执行
poetry install直接运行wsgi.py,也能从pyproject.toml里读到版本号。
内容的提问来源于stack exchange,提问作者pgossa
相关产品推荐
相关产品推荐

