我试图从mac终端设置一个python服务器。

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

python -m SimpleHTTPServer

但这给了我错误:

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

我以前使用相同的命令打开了一个连接 在我的电脑里的不同位置的一个不同的网站。


当前回答

补充迈克尔·施密德的答案 刚刚遇到了一个问题,为了允许重新绑定端口,需要像这样子类化套接字服务器:

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或任何您正在使用的东西。

其他回答

简单的解决方案:

查找使用端口8080的进程:

sudo lsof -i:8080

终止该端口上的进程:

kill $PID

kill -9 $PID  //to forcefully kill the port

PID从步骤1的输出中获得。

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

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

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

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

kill 81651

这将发送一个标准SIGTERM信号;如果进程没有响应,你可能不得不求助于更严格的方法,比如发送SIGKILL (kill -s kill <pid>或kill -9 <pid>)信号。详见维基百科。

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

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

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

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

最好在您的本地系统中使用它。(所以最好把这个脚本保存在一个shell配置文件中,比如ksh/zsh或bash配置文件,这取决于用户的偏好)

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

用法:

killport port_number

例子:

killport 8080

返回此错误是因为试图在项目仍在运行时重新运行该项目。停止并重新启动项目。

补充迈克尔·施密德的答案 刚刚遇到了一个问题,为了允许重新绑定端口,需要像这样子类化套接字服务器:

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或任何您正在使用的东西。