Python socket.error:[Errno 48]地址已在使用中
我正在尝试从mac终端用python设置服务器 我导航到文件夹位置并使用:Python socket.error:[Errno 48]地址已在使用中,python,macos,simplehttpserver,Python,Macos,Simplehttpserver,我正在尝试从mac终端用python设置服务器 我导航到文件夹位置并使用: python -m SimpleHTTPServer 但这给了我一个错误: socket.error: [Errno 48] Address already in use 我以前使用相同的命令打开过一个连接 对于位于我的计算机中不同位置的不同网站。您已将一个进程绑定到默认端口(8000)。如果您以前已经运行过相同的模块,则进程很可能仍然绑定到端口。首先尝试并定位其他进程: $ ps -fA | grep python
python -m SimpleHTTPServer
但这给了我一个错误:
socket.error: [Errno 48] Address already in use
我以前使用相同的命令打开过一个连接
对于位于我的计算机中不同位置的不同网站。您已将一个进程绑定到默认端口(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
或kill-9
)信号。看
或者,通过在命令行上指定替代端口,在其他端口上运行服务器:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
然后以
http://localhost:8910
;其中8910
可以是1024及以上的任意数字,前提是端口尚未占用。您还可以在下一个最高可用端口上提供服务,在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)
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)
这不如本机Python方法可靠,因为bash脚本没有捕获端口——另一个进程可以在进程捕获端口之前捕获端口(竞争条件)——但在使用没有自己的重试方法的实用程序时,仍然可能非常有用。简单解决方案:
8080
查找进程:PID是从步骤1的输出中获得的。顺便说一句,为了防止这种情况发生,只需在SimpleHTTPServer仍然正常运行的情况下在终端中按Ctrl+C。这将“正确”停止服务器并释放端口,这样您就不必在重新启动服务器之前再次查找并终止进程 (Mods:我确实试着把这个评论放在最好的答案上,但我没有足够的声誉。)使用
sudo lsof -i:5000
这将为您提供使用端口(如果有)的进程列表。
给出进程列表后,使用PID列上的id终止进程使用
kill 379 #use the provided PID
我对Python还不熟悉,但经过简短的研究,我发现这是绑定套接字的典型情况。碰巧套接字仍在使用中,您可能需要等待使用它。或者,您可以添加:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
这将使端口在更短的时间内可用。在我的例子中,它几乎立即使端口可用 以防上述解决方案无效:
我有一个raspberry pi,我正在使用PythonWeb服务器(使用Flask)。我已经尝试了以上所有方法,唯一的解决方案是关闭终端(外壳)并再次打开它。或者重新启动raspberry pi,因为没有任何东西可以阻止该Web服务器…简单的一行命令来摆脱它,在terminal中键入下面的命令
ps -a
kill -9 (processID)
这将列出Python正在使用的所有进程、签出,并在终端中键入bellow命令
ps -a
kill -9 (processID)
例如kill-9 33178您可以允许服务器将地址与一起重用 服务器是否允许重新使用地址。这默认为
False
,可以在子类中设置以更改策略
这对于任何开发人员来说都是常见的用例 最好将其作为本地系统的功能。(因此最好根据用户偏好将此脚本保存在一个shell配置文件中,如ksh/zsh或bash配置文件) 用法:
killport port_number
例如:
killport 8080
从
刚刚遇到问题,要允许端口使用的重新绑定,需要对套接字服务器进行子类化,如下所示:
someprogram --port=$(get-free-port)
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或您正在使用的任何东西。Case with me
当我调试或运行服务器时会发生这种情况,当调试或运行完成时,我不会终止进程,而是断开它的连接
当我们试图在服务器仍在运行时关闭PyCharm时,PyCharm会询问这两个选项
这导致进程仍在该特定地址的后台运行,因此,地址已在使用中
错误
解决方案
对我有用
另一种情况-多个进程
如果有多个服务器/应用程序使用python运行(显然,在不同的端口杀死另一个进程,或者用不同的端口运行这个进程:
python-m SimpleHTTPServer 8081
我应该在浏览器中有什么url来查看它是否工作?我在不同的端口上运行,正如您所建议的,我可能需要使用sudo Kill-9 PID
谢谢,@Danpe,我尝试了“sudo Kill PID”它不起作用,但“sudo kill-9 PID”终止了进程。有人知道-9指定了什么吗?甚至sudo手册似乎也没有涵盖这个参数@seokhoonlee:kill
向进程发送一个信号,它可以决定处理这个信号(比如优雅地关闭或旋转日志文件)。这些信号是整数(每个都有一个名称),默认值为15,表示术语
或终止。使用-9发送信号9,终止
,进程无法捕获和忽略该信号,操作系统将结束进程,不管它喜欢与否。@seokhoonley:另请参阅on W
pkill python