问题出现和解决过程
近期更新了pycharm版本从2023.01.06升级了2025.2.1版本,但是在升级之后,使用pycharm的调试模式运行uvicorn.run(app)
报错如下:
产生过以下几个可能性猜测
-
fastapi
和uvicorn
版本不匹配的问题
但是根据目前已经都是按照最新的版本已经更新了,还是不行 -
是
fastapi
初始化内容中存在其他未发现的异步操作引发
所以自己完全新建了一个最简的fastapi
应用,运行结果仍然是报错
-
怀疑是pycharm调试模式运行的问题
怀疑原因如下:
- uvicorn.run执行的reload参数为true时,能够正常调试运行,但是不设置或者设置为false不能运行
- 已经尝试过按照最简fastapi应用运行,但是还是报错
- 已经尝试在控制台能够正常运行
通过上述尝试和排查基本确定是由于pycharm的版本原因导致,通过pycharm配置已解决
与deepseek的确定
你在PyCharm调试模式下遇到的 TypeError: _patch_asyncio.<locals>.run() got an unexpected keyword argument 'loop_factory'
错误,通常与PyCharm调试器和异步事件循环的交互方式有关。下面我来帮你分析原因并提供解决方案。
🔍 问题根源
这个错误的核心原因通常是:
- PyCharm异步调试器冲突:PyCharm 2023.3.3及更高版本引入并默认启用了"异步IO调试器支持"的实验性功能。该功能旨在改进对Python异步代码的调试体验,但可能会与uvicorn服务器的事件循环设置产生冲突,导致在传递参数(如
loop_factory
)时出现异常。 - 事件循环环境差异:当你设置
reload=True
时,uvicorn会启动一个子进程来运行应用,这个子进程拥有一个干净的事件循环环境,从而可能避开了主进程中的环境冲突。而当reload=False
时,uvicorn尝试在当前进程(即PyCharm调试器控制下的进程)的事件循环中启动服务器,此时PyCharm调试器对事件循环的干预就可能引发参数不匹配的错误。
🛠️ 解决方案
你可以尝试以下几种方法,建议从第一种开始:
-
禁用PyCharm的实验性异步调试支持
这是最直接的解决方法,通过关闭可能导致冲突的功能来解决问题。- 在PyCharm中,连续按两下
Shift
键,打开"Search Everywhere"对话框。 - 输入
Registry...
(包含三个点)并回车。 - 在打开的注册表窗口中,找到并取消勾选
python.debug.asyncio.repl
选项。 - 关闭注册表窗口,并重新启动调试会话。
- 在PyCharm中,连续按两下
-
使用命令行启动替代PyCharm运行配置
绕过PyCharm的调试器,直接使用终端命令启动uvicorn,可以确保服务器在一个干净的环境中启动。- 在PyCharm中打开终端(Terminal)。
- 使用以下命令启动你的应用(请根据你的实际文件路径调整
app.main:app
):uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
- 这种方式通常能有效避免由IDE运行配置引发的问题。
-
调整代码中的事件循环配置
如果问题与事件循环的特定实现(如uvloop
)有关,可以尝试强制使用标准的asyncio
事件循环。- 在你的启动脚本中(通常是包含
uvicorn.run
的那个文件),进行如下修改:import uvicorn import asyncio# 在uvicorn.run之前,设置使用标准asyncio事件循环 asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy())if __name__ == "__main__":uvicorn.run("app.main:app",host="0.0.0.0",port=8000,reload=False, # 即使reload为False也尝试解决loop="asyncio" # 明确指定使用asyncio)
- 在你的启动脚本中(通常是包含
-
尝试程序化启动方式
使用uvicorn.Server
和Config
类来启动,有时能提供更好的控制。- 将你的启动代码修改为:
import uvicornif __name__ == "__main__":config = uvicorn.Config("app.main:app", host="0.0.0.0", port=8000, reload=False)server = uvicorn.Server(config)server.run()
- 将你的启动代码修改为:
💎 总结
这个错误通常源于PyCharm调试环境与uvicorn事件循环设置之间的交互问题。大多数情况下,禁用PyCharm的异步调试功能或改用命令行启动就能解决。