Python [Errno 98]地址已在使用中

sky*_*erl 80 python sockets connection errno

在我的Python套接字程序中,我有时需要用它来中断它Ctrl-C.当我这样做时,它会使用关闭连接socket.close().

但是,当我尝试重新打开它时,我必须等待一段时间才能再次连接.如何正确关闭套接字?或者这是打算?

Bar*_*osz 101

是的,它是有目的的.在这里你可以阅读详细的解释.可以通过在套接字上设置SO_REUSEADDR选项来覆盖此行为.例如:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)

  • 重要提示: `sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)` 有效,但您应该在创建套接字后立即使用它。在 `.bind()` 之后就不起作用了! (7认同)

Moh*_*ara 27

发生这种情况是因为您尝试在同一端口运行服务并且已经有一个应用程序在运行。这可能是因为您的服务没有在进程堆栈中停止。你只需要杀死这些进程。

这里不需要安装任何东西,这是杀死所有正在运行的 python 进程的单行命令。

对于基于 Linux 的操作系统:

重击:

kill -9 $(ps -A | grep python | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)

鱼:

kill -9 (ps -A | grep python | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)


ayo*_*ziz 22

$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,它并不总是有效。这是我遇到这个问题时的直接想法,但在我的情况下没有要杀死的 python 进程。 (5认同)
  • @Kryten 使用 Kill -9 81211 (2认同)

dir*_*kk0 16

如果在SocketServer模块中使用TCPServer,UDPServer或其子类,则可以设置此类变量(在实例化服务器之前):

SocketServer.TCPServer.allow_reuse_address = True
Run Code Online (Sandbox Code Playgroud)

(通过SocketServer.ThreadingTCPServer - 程序重启后无法绑定到地址)

这会导致init(构造函数):

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)


小智 11

一个对我有用的简单解决方案是关闭终端并重新启动它。


小智 11

对于Linux,

ps aux | grep python

这将向您显示错误。包含 python 文件的进程号(例如 35225)就是错误。

现在,

sudo kill -9 35225

这将终止错误进程,您的问题将得到解决。


Mir*_*rko 9

在调用之前,除了使用此命令运行子进程外,对我没有任何作用HTTPServer(('', 443), myHandler)

kill -9 $(lsof -ti tcp:443)
Run Code Online (Sandbox Code Playgroud)

当然,这仅适用于类似 linux 的操作系统!


Abd*_*sit 8

首先使用此命令找到python进程ID

ps -fA | grep python
Run Code Online (Sandbox Code Playgroud)

您将通过在第二列中命名您的 python 进程来获得 pid 号

然后使用此命令杀死进程

kill -9 pid
Run Code Online (Sandbox Code Playgroud)