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

2024-10-03 13:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个小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语句。在

我从命令行运行这个程序,以防这很重要。编辑:我在Kubuntu9.04i386上运行,通过backports使用KDE4.3。我使用firefox3.5作为我的默认浏览器,在KDE的系统设置中声明,程序可以正确地调用它。(至少,Firefox中会打开一个新的标签页,上面有所需的URL——我相信这是所需的功能。)/Edit

另外,我假设这个问题在几乎所有外部调用中都会发生,但我对Python非常陌生,不知道在这个站点上要搜索的术语。(搜索“pythonwebbrowser”没有得到任何有用的东西。)所以,如果已经在另一个标题下讨论过了,我很抱歉!在

有什么建议吗?在


Tags: 模块代码程序urlifdocanprint
3条回答

webbrowser模块发出一个系统调用来启动一个单独的程序(web浏览器),然后等待(“阻塞”)一个退出代码。当你从另一个程序启动一个程序时,就会发生这种情况。您必须(A)编写自己的函数,该函数不会阻塞等待webbrowser退出(通过使用threads、fork()或类似的函数),或者找出webbrowser模块是否有非阻塞调用。在

这看起来取决于你在哪个平台上运行。在

  • MacOSX-立即返回True并打开浏览器窗口。大概是你想要的行为。在
  • Linux(没有X)-打开链接文本模式浏览器。关闭后,返回True。在
  • Linux(使用X)-打开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()

在这里最简单的事情可能就是叉子。不幸的是,我很确定这在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()

相关问题 更多 >