如果线程运行webbrowser.open(),则无法使用Ctrl-C退出Python脚本

时间:2017-04-13 18:48:34

标签: python multithreading bottle

我正在使用适用于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的运行。

我有没有看到解决方案?

0 个答案:

没有答案