pip install websockets 失败主因是 python 版本低于3.7、setuptools/pip过旧或缺少wheel,需先升级pip/setuptools/wheel,避免系统python,内网需配镜像源,禁混用pip与conda。

安装 websockets 库时为什么 pip install websockets 失败?
多数失败源于 Python 版本或依赖冲突。websockets 要求 Python ≥ 3.7,且不兼容某些旧版 setuptools 或 pip。常见报错如 ModuleNotFoundError: No module named 'wheel' 或 error in websockets setup command。
- 先升级基础工具:
python -m pip install --upgrade pip setuptools wheel - 避免使用系统自带 Python(尤其 macOS),优先用
pyenv或conda管理环境 - 若公司内网限制 PyPI,需配置可信源:加
--index-url https://pypi.tuna.tsinghua.edu.cn/simple/ - 不要混用
pip和conda安装同一库,否则可能引发ImportError: cannot import name 'WebSocketServerProtocol'
启动一个最小可用的 WebSocket 服务端,但客户端连不上?
最常被忽略的是服务端未正确绑定地址或防火墙拦截。默认 websockets.serve() 只监听 127.0.0.1,外部机器无法访问。
- 显式指定
host="0.0.0.0":start_server = websockets.serve(echo, "0.0.0.0", 8765) - 确认端口未被占用:
lsof -i :8765(macOS/Linux)或netstat -ano | findstr :8765(Windows) - 临时关闭防火墙测试,或添加入站规则放行 TCP 8765
- 浏览器直连需用
ws://localhost:8765,https页面禁止加载ws(非wss),会触发SecurityError
调试消息收发时,await websocket.recv() 一直挂起?
这不是卡死,而是预期行为——recv() 是协程,必须等待客户端发送数据才会返回。常见误判为“没响应”,实则是逻辑阻塞点。
- 加超时保护:用
asyncio.wait_for(websocket.recv(), timeout=10),避免无限等待 - 不要在同步函数里调用
recv(),否则会报RuntimeWarning: coroutine 'WebSocketCommonProtocol.recv' was never awaited - 检查客户端是否真发了消息:用
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://localhost:8765模拟握手,观察服务端日志 - 若用
websocket-client(Python 客户端),确保调用ws.send()后再ws.recv(),顺序错会导致阻塞
用 asyncio.run() 启动服务后程序立即退出?
因为 asyncio.run() 运行完顶层协程就结束事件循环,而 websockets.serve() 返回的是协程对象,不是运行中的服务器。
- 必须
await它:正确写法是asyncio.run(main()),其中main()内部await websockets.serve(...)—— 但这样仍不对 - 真正该做的是:用
await asyncio.Future()或asyncio.Event().wait()让主协程长期存活 - 推荐写法:
async def main(): await websockets.serve(echo, "0.0.0.0", 8765); await asyncio.Future() # 永不完成 - 生产环境务必用
uvloop替代默认事件循环,并用supervisord或systemd管理进程生命周期
实际跑通的关键不在代码多短,而在确认每层连接是否真正建立:浏览器开发者工具 Network 标签页能看到 ws 连接状态,服务端日志要打印出 client connected,客户端 onopen 回调必须触发——三者缺一不可。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











