打开webbrowser后如何恢复程序(或退出)?

时间:2009-07-19 04:21:16

标签: python browser if-statement

我正在制作一个小型Python程序,它调用webbrowser模块打开一个URL。打开URL非常有用。

我的问题是,一旦达到这行代码,问题就会没有响应。如何让程序继续执行这行代码并继续执行?在有问题的行下面是有问题的行,在上下文中:

if viewinbrowser == "y":
    print "I can definitely do that. Loading URL now!"
    webbrowser.open_new(url)
    print "Exiting..."
    sys.exit()

程序没有达到执行print "Exiting...",我添加了因为我注意到程序由于某种原因没有离开if语句。

我正在从命令行运行此程序,以防这很重要。 编辑:我在Kubuntu 9.04 i386上运行,使用KDE 4.3通过backports。我使用Firefox 3.5作为我的默认浏览器,在KDE的系统设置中声明,并由程序正确调用。 (至少,在Firefox中打开一个带有所需URL的新标签 - 我相信这是所需的功能。) /编辑

此外,我认为这个问题几乎可以在任何外部调用中发生,但我对Python很新,并且不知道要在此站点上搜索的术语。 (搜索“python webbrowser”并没有产生任何帮助。)所以,如果已经在不同的标题下进行了讨论,我很抱歉!

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

这看起来取决于您正在运行的平台。

  • MacOSX - 立即返回True并打开浏览器窗口。大概是你想要的行为。
  • Linux(无X) - 打开链接textmode浏览器。关闭后,返回True。
  • Linux(带X) - 打开Konquerer(在我的例子中)。立即返回True。你想要的行为。

我猜你是在Windows上,正如另一位评论家提到的那样没有分叉。我也猜测webbrowser模块在内部使用fork,这就是为什么它在Windows上不适合你的原因。如果是这样,那么使用线程模块创建一个打开webbrowser的新线程可能是最简单的解决方案:

>>> import webbrowser
>>> import threading
>>> x=lambda: webbrowser.open_new('http://scompt.com')
>>> t=threading.Thread(target=x)
>>> t.start()

答案 1 :(得分:4)

这里最简单的事情可能是分叉。我很确定这在Windows中不起作用,因为我认为他们的流程模型可能与unix类操作系统不同。不过,这个过程将是类似的。

pid = os.fork()
if pid:
    # we are the parent, continue on
    print "This runs in a separate process from the else clause."

else:
    #child runs browser then quits.
    webbrowser.open_new(url)
    print "Exiting..."
    sys.exit()

答案 2 :(得分:0)

webbrowser模块进行系统调用以启动单独的程序(Web浏览器),然后等待(“阻止”)退出代码。只要您从其他程序启动程序,就会发生这种情况。你必须(A)编写自己的函数,不阻止等待webbrowser退出(通过使用线程,fork()或类似的东西),或者找出webbrowser模块是否有非阻塞调用。