#!/usr/bin/env python3 """ 便捷启动脚本 - 支持命令行参数指定环境 用法: python start.py # 使用默认配置 python start.py --env dev # 开发环境 python start.py --env test # 测试环境 python start.py --env prod # 生产环境 python start.py --port 9000 # 临时指定端口 """ import argparse import os import sys from pathlib import Path def main(): parser = argparse.ArgumentParser(description="启动 FastAPI 应用") parser.add_argument( "--env", choices=["dev", "test", "prod"], help="指定运行环境 (dev/test/prod)" ) parser.add_argument( "--host", help="指定主机地址" ) parser.add_argument( "--port", type=int, help="指定端口号" ) parser.add_argument( "--workers", type=int, help="指定 worker 数量(生产环境)" ) parser.add_argument( "--reload", action="store_true", help="启用热重载" ) parser.add_argument( "--log-level", choices=["critical", "error", "warning", "info", "debug"], help="日志级别" ) args = parser.parse_args() # 设置环境变量 if args.env: env_map = {"dev": "development", "test": "testing", "prod": "production"} os.environ["ENVIRONMENT"] = env_map[args.env] print(f"[INFO] 启动环境: {env_map[args.env]} (配置文件: .env.{args.env})") # 临时覆盖配置 if args.host: os.environ["HOST"] = args.host if args.port: os.environ["PORT"] = str(args.port) if args.workers: os.environ["WORKERS"] = str(args.workers) if args.reload: os.environ["RELOAD"] = "True" if args.log_level: os.environ["LOG_LEVEL"] = args.log_level # 导入并启动应用 try: from main import app from app.core.config import settings import uvicorn print(f"[CONFIG] 当前配置:") print(f" - 环境: {settings.ENVIRONMENT}") print(f" - 主机: {settings.HOST}") print(f" - 端口: {settings.PORT}") print(f" - 调试: {settings.DEBUG}") print(f" - 热重载: {settings.RELOAD}") print(f" - Workers: {settings.WORKERS}") print(f" - 日志级别: {settings.LOG_LEVEL}") if settings.DOCS_URL: print(f"[DOCS] API 文档: http://{settings.HOST}:{settings.PORT}{settings.DOCS_URL}") print("-" * 50) # 根据环境决定是否使用字符串形式的 app(支持热重载) app_str = "main:app" if settings.RELOAD else app uvicorn.run( app_str, host=settings.HOST, port=settings.PORT, reload=settings.RELOAD, log_level=settings.LOG_LEVEL.lower(), workers=1 if settings.RELOAD else settings.WORKERS, ) except ImportError as e: print(f"[ERROR] 导入错误: {e}") print("请确保在正确的目录中运行此脚本") sys.exit(1) except Exception as e: print(f"[ERROR] 启动失败: {e}") sys.exit(1) if __name__ == "__main__": main()