我的工作基于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)
我的问题是这个代码可以多次运行,然后只有第一个实例才是实际服务的实例。是否有可能使程序返回错误以指示端口已被监听?
答案 0 :(得分:0)
在运行您的瓶子应用程序之前快速检查以查看端口是否打开可能很有用。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind(("127.0.0.1", 8000))
s.close()
上面的代码将尝试绑定到localhost上的socket 8000,如果套接字已在使用中,则返回48
错误Address already in use
将失败。如果成功,那么它将关闭(解除绑定)端口8000。
答案 1 :(得分:0)
首先选择一个免费端口:
s.bind("127.0.0.1", 0)
free_port = sock.getsockname()[1]
s.close()
这很容易出现竞争状况,但与首先绑定8000然后关闭相比,它不太可能击中它。
答案 2 :(得分:0)
抓住错误:
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
虽然我承认我并不清楚为什么你想要在你已经基本上做同样事情的堆栈跟踪时自己打印错误。无论如何,上述应该有效。希望有所帮助!