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

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

然而,当我尝试重新打开它,我必须等待,似乎一分钟之前,我可以再次连接。如何正确地关闭一个插座?还是故意的?

284805 次浏览

是的,是有意的。在这里你可以阅读 详细解释。可以通过在套接字上设置 SO _ REUSEADDR 选项来覆盖此行为。例如:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

如果在 socketserver模块中使用 TCPServerUDPServer或它们的子类,可以设置这个类变量(在实例化服务器之前) :

socketserver.TCPServer.allow_reuse_address = True

(via SocketServer.ThreadingTCPServer-程序重新启动后无法绑定到地址)

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

 if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12
python -m SimpleHTTPServer


$ kill 81211

除了在调用 HTTPServer(('', 443), myHandler)之前用这个命令运行一个子进程之外,没有什么对我有用:

kill -9 $(lsof -ti tcp:443)

当然,这只适用于类 Linux 操作系统!

一个简单的解决方案,我的工作是关闭终端和重新启动它。

之所以会发生这种情况,是因为您试图在同一端口运行服务,并且已经有一个正在运行的应用程序。 它可能发生,因为您的服务没有在进程堆栈中停止。您只需要终止这些进程。

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

基于 Linux 的操作系统:

巴斯:

kill -9 $(ps -A | grep python | awk '{print $1}')

鱼:

kill -9 (ps -A | grep python | awk '{print $1}')

运行命令

fuser -k (port_number_you_are _trying_to_access)/TCP

烧瓶示例: fuser -k 5000/tcp

另外,请记住,当您使用 ctrl + z 进行输入时会出现这个错误,所以要终止使用 ctrl + c

首先,使用以下命令查找 python 进程 ID

ps -fA | grep python

通过在 第二列上命名 Python 进程,您将获得一个 pid 号

然后使用以下命令终止进程

kill -9 pid

Sudo pkill-9 python

试试这个命令

我有同样的问题(Err98地址已经在使用中)在树莓派运行巨蟒电动汽车充电管理器的特斯拉墙连接器。该软件以前一直很好,但它停止审问太阳能逆变器的一天,我花了几天的时间,以为这是我在巨蟒的东西。原来,根本原因是 Wifi 调制解调器分配一个新的动态 IP 太阳能逆变器作为引进一个新的智能电视到我的家。我修改了 python 代码,以反映我在 wifi 调制解调器上找到的新 IP 地址,这个问题就解决了。

我在 Dooo 服务器上也遇到过类似的错误,并通过以下简单的步骤解决了这个问题:

  1. 在终端中粘贴跟随代码

    Ps-fA | grep python

您将得到一个 pid 号。现在从终端输出的第二列复制该 pid 号。

  1. 然后按下面的方式写

    杀死 -9 pid

终端将重新启动,然后命令

flask run

没问题! 谢谢你

对于 Linux 来说,

ps aux | grep python

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

现在,

sudo kill -9 35225

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

什么都不做,只要等几分钟,问题就会得到解决。这是由于某些进程的缓慢终止造成的,这就是为什么它甚至没有显示在正在运行的进程列表中。

在我通过 Thonny 编写 Pico w 程序时运行我的代码,得到了这个错误。在命令行中,只需执行 socket.set ()命令就可以清除这个问题。

>>> socket.reset()

使套接字 马上可重用的最干净的方法是按照建议首先关闭连接的客户端(插座) ,并确保服务器端最后关闭(如果需要,通过异常处理)。

这很可能意味着服务器端将永远运行。

如果“永久”循环 暂停执行,例如从套接字读取,那么这就不是问题。

只要没有客户端(除了明显的系统级异常) ,如何“破坏”这个“永久”循环取决于服务器管理员

我尝试了以下代码来解决这个问题:

sudo lsof -t -i tcp:8000 | xargs kill -9