如何在打开浏览器后恢复程序(或退出)?

5 投票
3 回答
3979 浏览
提问于 2025-04-15 12:59

我正在制作一个小的Python程序,它使用webbrowser模块来打开一个网址。打开网址的功能非常好用。

我的问题是,当程序运行到这一行代码时,它就不再响应了。我该如何让程序继续执行,跳过这一行代码呢?下面是有问题的代码行,放在上下文中:

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上运行,使用的是通过backports安装的KDE 4.3。我把Firefox 3.5设置为默认浏览器,并在KDE的系统设置中进行了声明,程序也能正确调用它。(至少,Firefox中会打开一个新标签,显示我想要的网址——我认为这就是我想要的功能。)/补充

另外,我猜这个问题在调用其他外部程序时也会出现,但我对Python非常陌生,不知道该用什么术语在这个网站上搜索。(搜索“python webbrowser”没有找到任何有用的信息。)所以,如果这个问题已经在其他地方讨论过,我在这里提问就很抱歉!

有什么建议吗?

3 个回答

0

webbrowser模块会发出一个系统指令,去启动一个独立的程序(也就是网页浏览器),然后它会等待这个程序结束并返回一个退出代码。这种情况在你从一个程序启动另一个程序时都会发生。你需要(A)自己写一个函数,让它在等待网页浏览器结束时不阻塞(可以使用线程、fork()或者类似的方法),或者查一下webbrowser模块是否有不阻塞的调用方式。

7

这看起来是跟你使用的平台有关。

  • MacOSX - 立刻返回True,并打开浏览器窗口。这应该是你想要的效果。
  • Linux(没有图形界面) - 打开一个文本模式的浏览器。关闭后才返回True。
  • Linux(有图形界面) - 打开Konquerer(在我这里是这样)。立刻返回True。这也是你想要的效果。

我猜你是在Windows上,因为另一个评论者提到Windows没有fork这个功能。我还猜测webbrowser模块内部使用了fork,这就是为什么在Windows上不工作的原因。如果是这样的话,使用线程模块创建一个新线程来打开webbrowser可能是最简单的解决办法:

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

这里最简单的做法可能就是“分叉”(fork)。不过很遗憾,我觉得在Windows系统上可能不太适用,因为我认为它们的进程模型和类Unix操作系统可能不一样。不过,整体的过程还是会类似的。

import os
import sys

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()

撰写回答