为什么Python Uvicorn热重载不生效

老敏姑娘_5058

老敏姑娘_5058

2026-09-11

310人浏览

原创

直接运行 python main.py 会绕过uvicorn热重载机制,因--reload仅在uvicorn主进程启动时生效;正确做法是终端执行uvicorn main:app --reload,或ide中配置为module模式运行uvicorn。

为什么python uvicorn热重载不生效

直接运行 python main.py 会绕过热重载机制

Uvicorn 的 --reload 只在它自己作为主进程启动时才生效。如果你在代码里写 uvicorn.run("main:app", reload=True),再用 PyCharm 或 VSCode 点「运行」按钮,实际是 Python 解释器直接执行脚本 —— 此时 uvicorn 的文件监听器根本没机会接管进程生命周期。

常见错误现象:

  • 控制台显示 INFO: Uvicorn running on http://...,但改完保存后毫无反应
  • PyCharm Event Log 里出现 Restarting with reloader,但服务没重启
  • 用 ps aux | grep uvicorn 查不到子进程,只看到一个孤立的 python 进程

正确做法只有两种:

  • 终端里手动运行:uvicorn main:app --reload(确保当前目录是项目根)
  • 在 IDE 配置中明确使用 module 模式:PyCharm 选「Module name」填 uvicorn,参数写 ["main:app", "--reload"];VSCode 的 launch.json 里设 "module": "uvicorn"

--reload 启用了,但文件改动仍不触发重启

Uvicorn 默认只监听当前工作目录(.)下的 Python 文件,且依赖系统级文件事件通知。一旦路径、权限或底层库出问题,监听就静默失效。

排查要点:

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
  • 确认运行命令是否带了 --reload-dir:比如项目结构含 src/ 和 api/,就得加 --reload-dir ./src --reload-dir ./api
  • 检查 watchfiles 是否装对:pip show watchfiles 应输出版本号;若没装或版本太老(uvicorn[standard] 必须重装:pip install --force-reinstall uvicorn[standard]
  • WSL / Docker / Windows 上容易触发轮询失败:临时加环境变量 WATCHFILES_FORCE_POLLING=true,再试一次
  • 杀毒软件或 OneDrive / Dropbox 实时同步可能拦截文件变更事件,可临时禁用测试

PyCharm 里配置了 --reload,但重载极慢或卡住

这不是 bug,是 PyCharm 对终端模拟和信号转发的限制导致 uvicorn 的子进程无法被正常 kill + fork。尤其在新版 PyCharm(2025.2+)和 uvicorn ≥0.22.0 组合下更明显。

实操建议:

  • 优先降级 uvicorn:pip install "uvicorn(0.21.1 是目前最稳的版本)
  • 运行配置中勾选 Emulate terminal in output console(但注意:ANSI 颜色日志会乱码)
  • 避免在 PyCharm 里「Debug」模式下开 --reload:调试时关掉 --reload,改用断点 + 手动重启;热重载阶段切到「Run」模式
  • 如果必须调试 + 热重载共存,改用 watchfiles run_process 替代:watchfiles "uvicorn main:app" ./

--reload 和 --workers 一起用,为什么多进程消失了?

这是设计使然,不是故障。--reload 要求 uvicorn 以单进程模式运行,才能安全地 fork 新实例。只要命令里同时出现这两个参数,uvicorn 会直接忽略 --workers 并输出警告:WARNING: "workers" flag is ignored when reloading is enabled.

所以:

  • 本地开发:只用 --reload,别加 --workers
  • 想测多进程行为:关掉 --reload,改用 --workers 4 --loop uvloop
  • 真要兼顾?用 hypercorn 替代:hypercorn main:app --reload --workers 4(它支持两者共存)

真正容易被忽略的是:很多人在 pyproject.toml 或 Makefile 里固化了带 --workers 的命令,却忘了开发时该删掉它 —— 结果 reload 看似开着,实则被 silently disabled。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4164

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24177

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2967

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2987

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2303

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程