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

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

python -m SimpleHTTPServer

但这给了我错误:

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

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


当前回答

Use

 sudo lsof -i:5000

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

 kill 379 #use the provided PID

其他回答

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

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

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

(Mods:我确实试图把这条评论放在最好的答案上,但我没有足够的声誉。)

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

获取进程正在侦听的端口: $ ps ax | grep python 终止进程 $ kill PROCESS_NAME

你也可以服务于下一个最高的可用端口,在Python中这样做:

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

port = 8000
while True:
    try:
        httpd = SocketServer.TCPServer(('', port), Handler)
        print 'Serving on port', port
        httpd.serve_forever()
    except SocketServer.socket.error as exc:
        if exc.args[0] != 48:
            raise
        print 'Port', port, 'already in use'
        port += 1
    else:
        break

如果你需要为其他实用程序做同样的事情,作为bash脚本可能更方便:

#!/usr/bin/env bash

MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}

(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

将它设置为一个名为get-free-port的可执行文件,你可以这样做:

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

这不如原生Python方法可靠,因为bash脚本不会捕获端口——另一个进程可能会在您的进程之前捕获端口(竞态条件)——但在使用没有自己的重试方法的实用程序时,仍然可能足够有用。

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