在无头模式下调用Python的webbrowser并禁用stderr

2 投票
1 回答
764 浏览
提问于 2025-04-28 00:49

为了避免这个变成一个XY问题,我会告诉你我遇到的问题,以及我无法解决的提议方案。

我正在尝试在一个脚本中调用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的进程会在脚本结束后继续在终端中打印。

我还尝试过:抑制调用外部库的模块输出,但没有成功。

我不能使用:在调用python webbrowser时抑制/重定向stderr中的建议,因为我希望webbrowser能够选择默认浏览器。

可能的解决方案(其中任何一个都可以):

有没有办法知道我是否处于无头模式?如果我能知道自己处于ssh/无头模式,我就可以对无头模式使用一种方法,对非无头模式使用另一种方法。

有没有办法让webbrowser.get('default').open()不输出那些杂乱的信息?

有没有办法在不使用subprocess的情况下“管道”浏览器的输出?

还有其他任何能解决这个问题的方法……

暂无标签

1 个回答

0

为了回答你的第一个问题,可能的解决方案是:

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

在一些奇怪的环境中,这个设置可能并不总是有效,但它应该是有效的。

如果你想把错误信息输出到别的地方,我觉得你可以这样做:

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

你说你不能这样做是因为你的程序结束的时间,但也许你可以在不替换旧的错误输出的情况下做到这一点。

撰写回答