Linux/macOS用lsof -i :端口查占用进程,Windows用netstat -ano | findstr :端口查PID;需结合taskkill或kill终止,但须先确认是否为关键服务或TIME_WAIT残留。

直接换端口最省事,但得先搞清是谁占的——不是所有“被占用”都该杀进程。
查端口谁在用:Linux/macOS 用 lsof,Windows 用 netstat
错误现象:启动时抛出 OSError: [Errno 98] Address already in use,尤其在 Ctrl+C 强退后高频出现。
- Linux/macOS:运行
sudo lsof -i :5000(把5000换成你实际想用的端口),看输出里PID列;如果没结果,说明没进程真占着,可能是 TIME_WAIT 状态残留,等几十秒再试 - Windows:管理员权限运行
netstat -ano | findstr :5000,找到对应 PID 后用taskkill /pid 1234 /f杀掉 - macOS 特别注意:
5000可能被系统服务(如 AirPlay Receiver)悄悄占用,lsof不一定显示,直接换端口更稳妥
PyCharm 里改端口为啥不生效?
因为 PyCharm 默认把 Flask 当作“特殊项目”,会忽略你代码里的 app.run(port=8080),只认自己的运行配置。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 点右上角运行配置下拉菜单 → Edit Configurations
- 左侧选中你的 Flask 配置 → 在右侧 Environment variables 栏填入
FLASK_RUN_PORT=8080 - 或者更彻底:删掉默认的 Flask Server 配置,新建一个 Python 类型配置,脚本路径设为你的
app.py,参数写--port 8080(前提是你的代码里解析了sys.argv)
用 app.run() 启动时 debug 和 reloader 的坑
设 debug=True 时,默认开启 use_reloader=True,文件变动会 fork 新进程,但旧进程未必干净退出,导致端口残留。
- 开发时想保留自动重载,又怕端口冲突?加这一句:
app.run(debug=True, use_reloader=True, port=5001)—— 换个端口,避免和旧进程撞车 - 如果只是临时调试,干脆禁用重载:
app.run(debug=True, use_reloader=False),自己手动 Ctrl+C + 回车重启 - 生产环境别用
app.run(),Gunicorn 或 Uvicorn 才是正解,它们自带进程管理,不会留孤儿监听
真正麻烦的不是端口被占,而是你不知道它被谁占、为什么占、占了还关不干净。尤其在 macOS 和 PyCharm 组合下,表面是端口问题,底层可能是系统服务、IDE 插件、或 Python 进程树没清理干净——别急着 kill -9,先 lsof 或 netstat 看一眼 PID 所属进程名,比盲目杀更安全。










