当前位置: 首页 > news >正文

pycharm中使用调试模式运行 uvicorn.run(app)报错TypeError: _patch_asyncio.locals.run() got an unexpected keywor解决

问题出现和解决过程

近期更新了pycharm版本从2023.01.06升级了2025.2.1版本,但是在升级之后,使用pycharm的调试模式运行uvicorn.run(app)报错如下:image
产生过以下几个可能性猜测

  1. fastapiuvicorn版本不匹配的问题
    但是根据目前已经都是按照最新的版本已经更新了,还是不行

  2. fastapi初始化内容中存在其他未发现的异步操作引发
    所以自己完全新建了一个最简的fastapi应用,运行结果仍然是报错
    image

  3. 怀疑是pycharm调试模式运行的问题
    怀疑原因如下:

  • uvicorn.run执行的reload参数为true时,能够正常调试运行,但是不设置或者设置为false不能运行
  • 已经尝试过按照最简fastapi应用运行,但是还是报错
  • 已经尝试在控制台能够正常运行

通过上述尝试和排查基本确定是由于pycharm的版本原因导致,通过pycharm配置已解决

与deepseek的确定

你在PyCharm调试模式下遇到的 TypeError: _patch_asyncio.<locals>.run() got an unexpected keyword argument 'loop_factory' 错误,通常与PyCharm调试器和异步事件循环的交互方式有关。下面我来帮你分析原因并提供解决方案。

🔍 问题根源

这个错误的核心原因通常是:

  1. PyCharm异步调试器冲突:PyCharm 2023.3.3及更高版本引入并默认启用了"异步IO调试器支持"的实验性功能。该功能旨在改进对Python异步代码的调试体验,但可能会与uvicorn服务器的事件循环设置产生冲突,导致在传递参数(如loop_factory)时出现异常。
  2. 事件循环环境差异:当你设置 reload=True 时,uvicorn会启动一个子进程来运行应用,这个子进程拥有一个干净的事件循环环境,从而可能避开了主进程中的环境冲突。而当 reload=False 时,uvicorn尝试在当前进程(即PyCharm调试器控制下的进程)的事件循环中启动服务器,此时PyCharm调试器对事件循环的干预就可能引发参数不匹配的错误。

🛠️ 解决方案

你可以尝试以下几种方法,建议从第一种开始:

  1. 禁用PyCharm的实验性异步调试支持
    这是最直接的解决方法,通过关闭可能导致冲突的功能来解决问题。

    • 在PyCharm中,连续按两下Shift键,打开"Search Everywhere"对话框。
    • 输入Registry...(包含三个点)并回车。
    • 在打开的注册表窗口中,找到并取消勾选python.debug.asyncio.repl选项。
    • 关闭注册表窗口,并重新启动调试会话。
      image
      image
  2. 使用命令行启动替代PyCharm运行配置
    绕过PyCharm的调试器,直接使用终端命令启动uvicorn,可以确保服务器在一个干净的环境中启动。

    • 在PyCharm中打开终端(Terminal)。
    • 使用以下命令启动你的应用(请根据你的实际文件路径调整app.main:app):
      uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
      
    • 这种方式通常能有效避免由IDE运行配置引发的问题。
  3. 调整代码中的事件循环配置
    如果问题与事件循环的特定实现(如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)
      
  4. 尝试程序化启动方式
    使用uvicorn.ServerConfig类来启动,有时能提供更好的控制。

    • 将你的启动代码修改为:
      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的异步调试功能改用命令行启动就能解决。

http://www.jsqmd.com/news/3350/

相关文章:

  • 交换机命令
  • 2025.9.25
  • 空间三维坐标变换(转)-四元数-RowPitchYaw角互换
  • 易基因:Cell Rep:华农任文凯团队利用ChIP-seq及多组学解析过敏性疾病的关键调控机制|项目文章
  • 详细介绍:STL 容器 --- list 类
  • Idea代码回退已经push到远段仓库的代码分支到指定提交记录
  • 开写第一篇
  • 大模型function calling多轮对话开发示例
  • ViTables 安装与 HDF5 数据可视化全指南 - 实践
  • elementuiplus修改el-checked多选框样式
  • DataGrip格式化SQL模板
  • 靶向肽Dcpep - 教程
  • 计算机毕设java毕业生档案流向追踪系统的设计与实现 基于Java的毕业生档案管理与追踪系统的设计与实现 Java技术驱动的毕业生档案流向监测架构开发
  • 图思维胜过链式思维:JGraphlet构建任务流水线的八大核心原则
  • 两月九城,纷享销客渠道携手伙伴共创CRM新纪元
  • el-upload上传图片
  • C. Strange Function
  • 剑指offer-33、丑数
  • C#操作Excel核心要点:告别手动,拥抱自动化
  • 250925
  • 云平台qcow2镜像的制作
  • 使用责任链模式简化if-else代码示例
  • hf 下载模型
  • SQLAlchemy -> Base.metadata.create_all(engine )详解 - 实践
  • 使用Function Interface简化if-else代码示例
  • Up
  • Transformer 面试题及详细答案120道(51-60)-- 模型变体与改进 - 详解
  • Dockerfile构建镜像以及网络 - 详解
  • 详细介绍:2026毕设-基于Spring Boot的在线海鲜市场交易平台的设计与实现
  • 【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession的创建与生命周期