我试图从mac终端设置一个python服务器。
我导航到文件夹位置使用:
python -m SimpleHTTPServer
但这给了我错误:
socket.error: [Errno 48] Address already in use
我以前使用相同的命令打开了一个连接 在我的电脑里的不同位置的一个不同的网站。
我试图从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或任何您正在使用的东西。
其他回答
我有一个树莓派,我使用python web服务器(使用Flask)。我已经尝试了上面的所有方法,唯一的解决方案是关闭终端(shell)并再次打开它。或者重新启动树莓派,因为没有什么可以停止web服务器……
你也可以服务于下一个最高的可用端口,在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脚本不会捕获端口——另一个进程可能会在您的进程之前捕获端口(竞态条件)——但在使用没有自己的重试方法的实用程序时,仍然可能足够有用。
简单的解决方案:
查找使用端口8080的进程:
sudo lsof -i:8080
终止该端口上的进程:
kill $PID
kill -9 $PID //to forcefully kill the port
PID从步骤1的输出中获得。
Use
sudo lsof -i:5000
这将为您提供使用该端口的进程列表(如果有的话)。 一旦给出了进程列表,使用PID列上的id终止进程使用
kill 379 #use the provided PID
您可以使用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()