python报错整理 - 1:OSError: [Errno 48] Address already in use

问题

运行python web服务器时,报错:OSError: [Errno 48] Address already in use

原因

你尝试绑定的网络地址(比如IP地址和端口号)已经被另一个进程占用。

解决办法
  • Windows系统:
    可以使用netstattaskkill命令。假设你的Web服务器使用的是8000端口,你可以按照以下步骤操作:
# 查找占用8000端口的进程ID
netstat -ano | findstr :8000

# 假设找到的进程ID是1234,使用taskkill命令终止该进程
taskkill /F /PID 1234
  • Mac / Linux 系统:
    可以使用lsof命令来查找占用端口的进程,并使用kill命令终止该进程。
# 使用lsof命令查找占用8000端口的进程ID
lsof -i:8000

# 假设找到的进程ID是1234,使用kill命令终止该进程
kill -9 1234
补充

如果你是用的socket启动的服务器,执行kill命令后或socket关闭时,它可能会进入TIME_WAIT状态,以确保所有的数据包都被正确处理。在这个状态下,端口仍然不能被立即重新使用。

解决办法
  • 等待一段时间 :TIME_WAIT状态通常会持续几分钟,你可以等待一段时间(通常是几分钟),让端口自动释放。
  • 修改服务器代码以允许重用地址:在创建socket时,可以设置SO_REUSEADDR选项,这允许在同一端口上启动服务器的多个实例(只要它们不同时绑定)。亲测可用!
    代码如下:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 8000))

Note:这主要用于服务器需要快速重启的场景,而不是解决端口被占用的问题!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容