pycharm运行程序端口被占用,本质是关闭时残留后台python进程未彻底终止,导致flask、fastapi等服务持续监听端口;应通过netstat或lsof查pid后taskkill/kill强制结束,并检查pycharm运行配置中环境变量或参数是否覆盖代码端口设置。

PyCharm 运行程序提示端口被占用,基本就是有残留进程还在监听那个端口——不是代码写错了,也不是网络配置问题,而是系统里“活没干完就关窗”留下的烂摊子。
为什么 PyCharm 关掉后端口还被占着?
你点红色停止按钮或直接关掉终端窗口,PyCharm 并不总能干净杀掉所有子进程。尤其是 FastAPI、Flask、TensorBoard、Jupyter Notebook 这类自带 HTTP 服务的框架,启动时会 fork 出多个 Python 子进程,IDE 有时只终止了主进程,后台 worker 或 watchdog 还在跑。
常见表现:[Errno 10048] error while attempting to bind on address、Address already in use、the notebook server could not be started because no available port。
- Windows 下常看到多个
python.exe进程挂在任务管理器里 - macOS/Linux 下用
lsof -i :8000能查到 PID,但对应进程可能已“僵尸化” - 即使改了代码里的
port=8001,PyCharm 仍固执地用默认端口(比如 Flask 的 5000),因为它的运行配置优先级更高
怎么快速定位并杀掉占端口的进程?
别猜,直接查。命令行比任务管理器更准,尤其对隐藏进程。
Windows:
netstat -ano | findstr ":8000"
输出最后一列是 PID,比如 12345;再查它对应什么程序:
tasklist | findstr "12345"
确认是 Python 相关后,强制结束:
PyCharm 2026.2是 JetBrains PyCharm 的指定版本安装包,下载地址指向官方 Windows 安装包直链,可用于旧项目兼容、版本回退和环境测试。
taskkill /F /PID 12345
macOS/Linux:
lsof -i :8000
拿到 PID 后:
kill -9 12345
注意:netstat 和 lsof 查不到时,试试 sudo lsof -i :8000(权限不足会漏掉某些进程)。
PyCharm 自带的端口配置容易被忽略的坑
很多开发者改了代码里的 app.run(port=8001) 却没生效,是因为 PyCharm 的运行配置覆盖了它。
- Flask 项目:PyCharm 默认识别为
FlaskServer类型,它读取FLASK_RUN_PORT环境变量,而不是你代码里的参数 - FastAPI:如果你用
uvicorn.run(...)启动,PyCharm 仍可能按自己的方式注入参数 - Jupyter/TensorBoard:它们有固定默认端口(8888/6006),PyCharm 启动时不会自动换端口,除非你手动指定
解决办法:打开 Run → Edit Configurations,在 Environment variables 里加:
FLASK_RUN_PORT=8001(Flask)UVICORN_PORT=8001(FastAPI,取决于你是否用了环境变量驱动)
或者在 Additional options 里填:--port 8001
防复发的小习惯
端口冲突反复出现,说明清理动作没形成闭环。
- 别直接关终端窗口,先按 PyCharm 工具栏的红色 停止 按钮(它会发 SIGINT)
- 每次改端口前,先执行一次
netstat -ano | findstr ":" + 旧端口确认已释放 - 开发中固定用一个非默认端口(比如 8002、8080),避免和 Jupyter(8888)、TensorBoard(6006)、本地代理(8081)撞车
- 如果经常多人共用一台机器,建议在脚本开头加端口检测逻辑,比如尝试 bind 再抛异常,而不是等启动失败才报错
真正麻烦的不是杀进程,而是不知道哪个进程在背后偷偷听着——查 PID 要快,改配置要准,关程序要彻底。










