socket.error:地址已经在使用中

我试图用macterminal设置一个python服务器。

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

python -m SimpleHTTPServer 

但是这给了我错误:

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

我以前打开一个连接使用相同的命令在我的机器不同的位置不同的网站。

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

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

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

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

 kill 81651 

这发送一个标准的SIGTERM信号; 如果进程没有响应,你可能不得不采取更强硬的方法,例如发送SIGKILLkill -s KILL <pid>kill -9 <pid> )信号。 请参阅维基百科了解更多详情 。

或者,通过在命令行上指定替代端口,在另一个端口上运行服务器:

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

然后以http://localhost:8910访问服务器; 8910可以是从1024开始的任何数字,只要该端口还没有被占用。

简单的scheme:

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

    sudo lsof -i:8080

  2. 杀了它:

    kill XXXX

您也可以在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脚本不捕获端口 – 另一个进程可能在进程执行之前抢占端口(竞争条件) – 但是当使用不使用“自己有一个尝试再试的方法。

使用lsof -i:5000这将给你一个使用该端口的进程列表(如果有的话)。 一旦给出了进程列表,使用PID列上的id来终止进程:例如kill 379

顺便说一下,为了防止这种情况发生,只需在terminal中按Ctrl + C ,而SimpleHTTPServer仍然正常运行。 这将“正常”停止服务器并释放该端口,以便在重新启动服务器之前不必重新find并终止该进程。

(MODS:我确实试图把这个评论放在它所属的最好的答案上,但是我没有足够的声望。)