如果端口已经被监听,如何让 Bottle return 出错?
How to make Bottle return an error if a port is already being listened to?
我的工作基于 Bottle 的 "Hello World" 示例,可在此处找到:
https://bottlepy.org/docs/dev/tutorial.html
from bottle import Bottle, run
app = Bottle()
@app.route('/hello')
def hello():
return "Hello World!"
run(app, host='localhost', port=8080)
我的问题是这段代码可以 运行 多次,然后只有第一个实例才是实际执行服务的那个。是否可以让程序return报错表明端口已经被监听?
在 运行 您的 bottle 应用程序可能有用之前,快速而粗略地检查端口是否打开。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(("127.0.0.1", 8000))
s.close()
上面的代码将尝试绑定到本地主机上的套接字 8000,如果套接字已在使用中,将失败并返回 48
错误 Address already in use
。如果成功,它将关闭(解除绑定)端口 8000。
先选择一个空闲端口:
s.bind("127.0.0.1", 0)
free_port = sock.getsockname()[1]
s.close()
这很容易出现竞争条件,但与先绑定到 8000 然后关闭相比,它不太可能命中。
刚抓到错误:
try:
run(app, host='localhost', port=8080)
except Exception as exc:
print 'run exited: {}'.format(exc)
运行 当端口已经绑定时会产生
> python test.py
Bottle v0.12.8 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
run exited: [Errno 48] Address already in use
虽然我承认我不清楚为什么你要自己打印错误,而你已经得到的堆栈跟踪基本上做同样的事情。无论如何,以上内容应该有效。希望对您有所帮助!
我的工作基于 Bottle 的 "Hello World" 示例,可在此处找到: https://bottlepy.org/docs/dev/tutorial.html
from bottle import Bottle, run
app = Bottle()
@app.route('/hello')
def hello():
return "Hello World!"
run(app, host='localhost', port=8080)
我的问题是这段代码可以 运行 多次,然后只有第一个实例才是实际执行服务的那个。是否可以让程序return报错表明端口已经被监听?
在 运行 您的 bottle 应用程序可能有用之前,快速而粗略地检查端口是否打开。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(("127.0.0.1", 8000))
s.close()
上面的代码将尝试绑定到本地主机上的套接字 8000,如果套接字已在使用中,将失败并返回 48
错误 Address already in use
。如果成功,它将关闭(解除绑定)端口 8000。
先选择一个空闲端口:
s.bind("127.0.0.1", 0)
free_port = sock.getsockname()[1]
s.close()
这很容易出现竞争条件,但与先绑定到 8000 然后关闭相比,它不太可能命中。
刚抓到错误:
try:
run(app, host='localhost', port=8080)
except Exception as exc:
print 'run exited: {}'.format(exc)
运行 当端口已经绑定时会产生
> python test.py
Bottle v0.12.8 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
run exited: [Errno 48] Address already in use
虽然我承认我不清楚为什么你要自己打印错误,而你已经得到的堆栈跟踪基本上做同样的事情。无论如何,以上内容应该有效。希望对您有所帮助!