在无头模式下调用Python的webbrowser并禁用stderr
为了避免这个变成一个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 个回答
为了回答你的第一个问题,可能的解决方案是:
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
你说你不能这样做是因为你的程序结束的时间,但也许你可以在不替换旧的错误输出的情况下做到这一点。