我试图在mac终端上用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 <pid>
或kill -9 <pid>
)信号来代替。更多细节见维基百科。
另外,通过在命令行中指定替代端口,在一个不同的端口上运行服务器。
$ 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)
这不像本地Python方法那么可靠,因为bash脚本没有捕获端口--另一个进程可能在你的进程之前捕获端口(竞赛条件)--但在使用一个没有自己的尝试-重复方法的工具时,仍然可能足够有用。