FastApi项目启动失败 got an unexpected keyword argument ‘loop_factory‘
FastApi项目启动失败,
报错如下:ERROR - Failed to start server: _patch_asyncio.<locals>.run() got an unexpected keyword argument 'loop_factory'
分析原因:
PyCharm Debug 模式(pydevd)会对 asyncio 事件循环进行 monkey patch(即 _patch_asyncio),
而 uvicorn 新版本(>=0.30)使用了:
asyncio.run(self.serve(...), loop_factory=self.config.get_loop_factory())
但 PyCharm 的 _patch_asyncio.run() 版本 并不支持 loop_factory 参数,导致:
TypeError: got an unexpected keyword argument 'loop_factory'
而在 非 debug 模式 下,asyncio.run 是原生函数,没有被替换,自然不会报错。
这就是为什么普通启动没问题、debug 模式下就挂掉的原因。
解决办法:修改 uvicorn 启动方式,需要在 import uvicorn 前引入 import asyncio
源码如下,非debug模式下不会环境检测以及重启unicorn不会生效
# --------------------------
# ✅ 修复 PyCharm Debug 模式下 asyncio 兼容性问题
# --------------------------
import asyncio
if "_patch_asyncio" in asyncio.run.__qualname__:
logger.warning("检测到 PyCharm Debug 模式,正在修复 asyncio.run 兼容性问题...")
import asyncio.runners
asyncio.run = asyncio.runners.run # 强制还原原生 asyncio.run()
if __name__ == "__main__":
import uvicorn
# Determine reload setting
reload = args.reload if args.reload else False
try:
logger.info(f"Starting FICAgent API server on {args.host}:{args.port}")
# ✅ 注意:在 Debug 模式下不要启用多进程 workers,会与 pydevd 冲突
debug_mode = "_pydevd_bundle" in sys.modules
if debug_mode and args.workers > 1:
logger.warning("检测到 Debug 模式,多进程 worker 将被强制设置为 1")
args.workers = 1
uvicorn.run(
"src.server:app",
host=args.host,
port=args.port,
reload=reload,
log_level=os.getenv("LOGGING_LEVEL", "INFO").lower(),
workers=args.workers,
)
except Exception as e:
logger.error(f"Server startup failed: {e}", exc_info=True)
logger.error(f"Failed to start server: {str(e)}")
sys.exit(1)