在没有stderr和无头模式的情况下调用python web浏览器

时间:2014-10-16 21:19:32

标签: python subprocess stderr python-webbrowser

为了防止这是一个X Y问题,我会告诉你这个问题,以及我无法弄清楚如何做的建议解决方案。

我试图在脚本中调用webbrowser模块。

import webbrowser
webbrowser.open_new_tab('http://stackoverflow.com')

这真是太棒了。但是,我希望能够压缩它给我的输入。 在我当前的机器(ubuntu)上,我的浏览器(firefox)通过stderr吐出一堆垃圾。 我希望能够调用webbrowser并消除显示的文本。

我尝试过:

1 使用popen以便我可以将进程管道为空。

from subprocess import Popen, PIPE
Popen(['python -m webbrowser \'' + url + '\''], stderr=PIPE,
          stdout=PIPE, shell=True)

为什么这不起作用

这实际上在非无头模式下效果很好!当我在ssh终端(无头模式)中使用它时,子流程方面不允许我看到无头终端浏览器,它是webbrowser的一个很酷的功能。

2 重定向stderr

我无法在python中重定向stderr,因为python脚本通常在Web浏览器完成打印之前结束,因此在脚本结束后,webbrowser的进程将继续在终端中打印。

我也尝试过:Suppressing output of module calling outside library没有运气

我无法使用suppress/redirect stderr when calling python webrowser中的建议,因为我希望webbrowser选择默认浏览器。

可能的解决方案(只有其中一种就足够了):

有没有办法知道我是否处于无头模式?如果我知道我处于ssh / headless模式,我可以使用一种方法进行无头模式,另一种方法可以使用非无头模式。

有没有办法做webbrowser.get('默认')。open()以便webbrowser不会给我垃圾?

有没有办法去管道"浏览器的输出而不使用子进程?

还有其他可以解决问题的方法......

1 个答案:

答案 0 :(得分:0)

在可能的解决方案中回答您的(1):

import os     
def is_ssh(): 
    return "SSH_CLIENT" in os.environ or "SSH_TTY" in os.environ

在一个棘手的环境中,这可能并不总是被设定,但它应该是。

对于重定向stderr,我认为你可以这样做:

import sys, StringIO
old_stderr = sys.stderr
temp_stderr = StringIO.StringIO()
try:
    # do your thing...
finally:
    sys.stderr = old_stderr

你说你不能这样做是因为你的过程结束了,但你可以这样做而不用更换旧的stderr。