socket.error:[Errno 48]地址已被使用

时间:2013-09-28 20:48:09

标签: python macos simplehttpserver

我正在尝试使用mac终端设置python服务器。

我导航到文件夹位置使用:

python -m SimpleHTTPServer

但是这给了我错误:

socket.error: [Errno 48] Address already in use

我之前使用相同的命令打开了一个连接 对于我机器中不同位置的其他网站。

13 个答案:

答案 0 :(得分:302)

您已经有一个绑定到默认端口(8000)的进程。如果您之前已经运行过相同的模块,那么很可能该进程仍然绑定到该端口。首先尝试找到其他进程:

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

包含命令参数,因此如果有多个SimpleHTTPServer进程处于活动状态,您可以发现正在运行的python。您可能希望测试http://localhost:8000/是否仍显示本地文件的目录列表。

第二个数字是进程号;通过向服务器发送信号来停止服务器:

kill 81651

这会发送标准SIGTERM信号;如果流程没有响应,您可能不得不采用更强硬的方法,例如发送SIGKILLkill -s KILL <pid>kill -9 <pid>)信号。请参阅Wikipedia for more details

或者,通过在命令行上指定备用端口,在不同的端口上运行服务器:

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

然后以http://localhost:8910访问服务器;其中8910可以是1024及以上的任何数字,前提是该端口尚未被采用。

答案 1 :(得分:107)

简单的解决方案:

  1. 使用端口8080查找流程:

    sudo lsof -i:8080

  2. 杀了它:

    kill XXXX

答案 2 :(得分:22)

使用

 sudo lsof -i:5000

这将为您提供使用该端口的进程列表(如果有)。 一旦给出了进程列表,使用PID列上的id终止进程使用

 kill 379 #use the provided PID

答案 3 :(得分:11)

顺便说一下,为了防止这种情况发生,只需在终端中按 Ctrl + C ,同时SimpleHTTPServer仍然正常运行。这将&#34;正确&#34;停止服务器并释放端口,这样您就不必在重新启动服务器之前再次查找并终止该进程。

(Mods:我确实试着将这个评论放在它所属的最佳答案上,但我没有足够的声誉。)

答案 4 :(得分:6)

您还可以在Python中使用下一个最高可用端口服务:

get-free-port

如果您需要为其他实用程序执行相同的操作,则作为bash脚本可能更方便:

someprogram --port=$(get-free-port)

将其设置为名为¤ Job 0 > OnOk Job 1 > OnError Job 1 > OnOk Job 2 > OnOk Job 3 的可执行文件,您可以执行以下操作:

tLoop--------(iterate)------tRunJob[job1]--------(onSubJobOk)---------tJava

这不像原生Python方法那样可靠,因为bash脚本不捕获端口 - 另一个进程可以在进程执行之前获取端口(竞争条件) - 但在使用实用程序时仍然可能有用没有自己尝试尝试的方法。

答案 5 :(得分:5)

我是Python的新手,但在我的简短研究之后,我发现这是典型的被绑定的套接字。恰好,套接字仍在使用,您可能需要等待才能使用它。或者,您可以添加:

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

这应该可以在更短的时间内使端口可用。在我的情况下,它几乎立即使端口可用。

答案 6 :(得分:2)

我有一个树莓派,并且我正在使用python Web服务器(使用Flask)。我已经尝试了以上所有内容,唯一的解决方案是关闭终端机(外壳),然后再次打开它。或重新启动树莓派,因为没有什么可以阻止该网络服务器...

答案 7 :(得分:2)

要删除它的简单一行命令,请在终端中键入以下命令,

ps -a

这将列出所有进程,并检查Python正在使用的结帐,并在终端中键入bellow命令,

kill -9 (processID) 

例如杀死-9 33178

答案 8 :(得分:1)

以防万一以上解决方案不起作用:

  1. 获取您的进程正在监听的端口:

    $ ps斧| grep python

  2. 终止流程

    $杀死PROCESS_NAME

答案 9 :(得分:1)

跟我一起来

当我调试或运行服务器时会发生这种情况,完成后,我断开连接而不是终止进程。

当我们在服务器仍在运行时尝试关闭 PyCharm 时,它会询问这两个选项

这导致该进程仍在该特定地址的后台运行,因此出现 Address already in use 错误。

解决方案

pkill python

对我有用。

另一种情况 - 多个进程

如果您有多个使用 python 运行的服务器/应用程序(显然,在不同的端口?),那么使用 PIDPORT 获取该进程的 kill

sudo lsof -i :5000 # here 5000 is the port number  

| COMMAND | PID    | USER     | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME                    |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python  | 185339 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185348 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185350 | username | 8u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |


kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is
<块引用>

检查@Andrew的回答以防止将来发生这种情况。

参考文献:kill commandkill/pkill/killalllsof

纳马斯特?

答案 10 :(得分:0)

您可以允许服务器通过allow_reuse_address重用地址。

  

服务器是否将允许地址的重用。默认值为False,可以在子类中进行设置以更改策略。

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()

答案 11 :(得分:0)

这对任何开发人员来说都是常见的用例。

最好将其作为本地系统的功能。 (因此最好根据用户偏好将此脚本保存在 ksh/zsh 或 bash 配置文件等 shell 配置文件之一中)

function killport {
   kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}

用法:

killport port_number

示例:

killport 8080

答案 12 :(得分:0)

添加到来自Michael Schmid的答案 刚刚遇到问题,要允许重新绑定端口使用需要像这样对套接字服务器进行 SUBCLASS:

from socketserver import TCPServer, BaseRequestHandler
from typing import Tuple, Callable
class MySockServer(TCPServer):
    def __init__(self, server_address: Tuple[str, int], RequestHandlerClass: Callable[..., BaseRequestHandler]):
        self.allow_reuse_address = True
        super().__init__(server_address, RequestHandlerClass)

因为在实例化之后,更改该标志没有意义。 然后使用它而不是 TCPServer 或您正在使用的任何东西。