irm*_*irm 196 python macos simplehttpserver
我正在尝试从mac终端设置一个带python的服务器.
我导航到文件夹位置使用:
python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
socket.error: [Errno 48] Address already in use
Run Code Online (Sandbox Code Playgroud)
我以前使用相同的命令为我机器中不同位置的不同网站打开连接.
Mar*_*ers 328
您已经有一个绑定到默认端口(8000)的进程.如果您之前已经运行过相同的模块,那么很可能该进程仍然绑定到该端口.首先尝试找到其他进程:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)
包含命令参数,因此SimpleHTTPServer如果有多个python进程处于活动状态,您可以发现正在运行的参数.您可能希望测试是否http://localhost:8000/仍显示本地文件的目录列表.
第二个数字是进程号; 通过发送信号来停止服务器:
kill 81651
Run Code Online (Sandbox Code Playgroud)
这发送标准SIGTERM信号; 如果该过程没有响应,您可能不得不求助于更强硬的方法,例如发送SIGKILL(kill -s KILL <pid>或kill -9 <pid>)信号.有关详细信息,请参阅Wikipedia.
或者,通过在命令行上指定备用端口,在不同的端口上运行服务器:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
Run Code Online (Sandbox Code Playgroud)
然后访问服务器http://localhost:8910; 其中8910可以是1024及以上的任何数字,只要该端口尚未被采用.
小智 130
简单方案:
使用端口查找进程8080:
sudo lsof -i:8080
杀死它:
kill XXXX
can*_*man 25
使用
sudo lsof -i:5000
Run Code Online (Sandbox Code Playgroud)
这将为您提供使用端口的进程列表(如果有).一旦给出了进程列表,使用PID列上的id来终止进程使用
kill 379 #use the provided PID
Run Code Online (Sandbox Code Playgroud)
Mar*_*pel 14
顺便说一下,为了防止这种情况发生,只需在SimpleHTTPServer仍然正常运行时按Ctrl+ C终端.这将"正确"停止服务器并释放端口,因此您无需在重新启动服务器之前再次查找并终止该进程.
(Mods:我确实试着将这个评论放在它所属的最佳答案上,但我没有足够的声誉.)
您可以允许服务器使用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()
Run Code Online (Sandbox Code Playgroud)
您还可以在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
Run Code Online (Sandbox Code Playgroud)
如果你需要为其他实用程序做同样的事情,它可能作为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
Run Code Online (Sandbox Code Playgroud)
将其设置为具有名称的可执行文件,get-free-port您可以执行以下操作:
someprogram --port=$(get-free-port)
Run Code Online (Sandbox Code Playgroud)
这不像本机Python方法那样可靠,因为bash脚本不捕获端口 - 另一个进程可以在进程执行之前抓取端口(竞争条件) - 但是当使用不具备的实用程序时仍然可能有用.它有自己的尝试再尝试方法.
当我调试或运行服务器并且完成后,Terminating我而不是进程时,就会发生这种情况Disconnect。
当我们在服务器仍在运行时尝试关闭 PyCharm 时,PyCharm 会要求提供这两个选项
这会导致该进程仍在该特定地址的后台运行,因此会出现Address already in use错误。
pkill python
Run Code Online (Sandbox Code Playgroud)
对我有用。
如果您有多个使用 python 运行的服务器/应用程序(显然,在不同的端口),则使用和it获取PIDPORTkill该进程的。
sudo lsof -i :5000 # here 5000 is the port number
| COMMAND | PID | USER | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python | 185339 | username | 7u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
| python | 185348 | username | 7u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
| python | 185350 | username | 8u | IPv4 | 598745 | 0t0 | TCP | localhost:5000 (LISTEN) |
kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is
Run Code Online (Sandbox Code Playgroud)
检查@Andrew的答案以防止将来出现这种情况。
参考文献:kill命令、kill/pkill/killall、lsof
合十礼
小智 6
我是Python的新手,但经过简短的研究,我发现这是绑定套接字的典型代表。碰巧的是,套接字仍在使用中,您可能必须等待使用它。或者,您可以添加:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)
这将使端口在较短的时间内可用。就我而言,它几乎可以立即使端口可用。
小智 5
简单的一行命令即可删除它,在终端中键入以下命令,
ps -a
Run Code Online (Sandbox Code Playgroud)
这将列出所有进程,签出Python正在使用的结账,并在终端中键入bellow命令,
kill -9 (processID)
Run Code Online (Sandbox Code Playgroud)
例如杀死-9 33178
| 归档时间: |
|
| 查看次数: |
305385 次 |
| 最近记录: |