我正在使用适用于Python的Bottle Web应用程序框架(pip install bottle
),并希望运行一个只能从本地计算机访问的Web应用程序(它本质上是一个使用浏览器进行GUI的桌面应用程序)。要启动瓶子web应用程序,我必须调用bottle.run()
,但只要脚本正在运行,这就会阻塞。按Ctrl-C停止它。
但是,我也希望这个应用程序通过调用webbrowser.open()
打开到localhost的Web浏览器。问题是,我不能先调用webbrowser.open()
,因为网络应用程序不会运行,但如果我先调用bottle.run()
,只要网络应用程序正在运行,它就不会返回无法继续致电webbrowser.open()
。
我的解决方案是将调用webbrowser.open()
放在一个帖子中:
import bottle
import threading
import webbrowser
import time
class BrowserOpener(threading.Thread):
def run(self):
time.sleep(1) # waiting 1 sec is a hack, but it works
webbrowser.open('http://localhost:8042')
print('Browser opened')
@bottle.route('/')
def index():
return 'hello world!'
BrowserOpener().start()
bottle.run(host='localhost', port=8042)
这个问题现在按下终端中的Ctrl-C似乎不起作用,所以除了完全关闭终端之外我无法停止Web应用程序。我不确定为什么会这样:'Browser opened'
会被打印到屏幕上,所以我知道webbrowser.open()
正在返回。
我在Windows 7上。
我已尝试设置self._running = False
的{{3}}解决方案,但这并没有改变任何内容。我也可以在线程之外找到join()
。
即使我摆脱了单独的线程并使用os.system('python openbrowser.py')
来运行等待一秒的脚本并打开webbrowser,这仍然阻止Ctrl-C工作。
我还尝试使用threading.Timer(1, webbrowser.open, ['http://localhost:8042']).start()
启动浏览器,但这仍然阻止了Ctrl-C的运行。
我有没有看到解决方案?