如何通过命令行将.env文件传入FastAPI应用?
实现启动时传入自定义.env文件路径的方案
Uvicorn本身没有内置--env参数来指定.env文件,但可以通过以下两种方式结合Pydantic实现需求:
方法一:通过环境变量传递路径
修改你的Settings类,让env_file优先读取环境变量的值,同时保留原路径作为默认 fallback:
from pydantic import BaseSettings, HttpUrl import os class Settings(BaseSettings): url: HttpUrl class Config: env_file = os.getenv("ENV_FILE", "config.env") # 环境变量存在则用它,否则用默认的config.env settings = Settings()
启动时通过环境变量指定自定义.env文件:
- Linux/macOS:
ENV_FILE=custom.env python -m uvicorn main:app --reload - Windows(CMD):
set ENV_FILE=custom.env && python -m uvicorn main:app --reload - Windows(PowerShell):
$env:ENV_FILE="custom.env"; python -m uvicorn main:app --reload
方法二:通过命令行参数直接传递
使用argparse解析自定义的--env参数,同时忽略Uvicorn自带的未知参数,再传给Pydantic的Settings:
from pydantic import BaseSettings, HttpUrl import argparse # 解析命令行参数,跳过Uvicorn的专属参数 parser = argparse.ArgumentParser() parser.add_argument("--env", default="config.env", help="指定.env文件路径") args, _ = parser.parse_known_args() class Settings(BaseSettings): url: HttpUrl # 实例化时直接指定_env_file参数,覆盖类内的默认配置 settings = Settings(_env_file=args.env)
启动时直接用--env参数指定路径:
python -m uvicorn main:app --reload --env custom.env
补充说明
Pydantic的BaseSettings支持在实例化时通过_env_file参数覆盖类Config中的配置,这种动态指定的方式比硬编码更灵活,适合需要切换不同配置文件的场景。
内容的提问来源于stack exchange,提问作者WhatTheWhat
相关产品推荐
相关产品推荐

