2

为了防止这成为一个 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重定向标准错误

我不能只在python中重定向stderr,因为python脚本通常在网络浏览器完成打印之前结束,所以在脚本结束后,webbrowser的进程会继续在终端中打印。

我也尝试过:抑制模块调用外部库的输出没有运气

我不能在调用 python webbrowser 时使用以下建议:suppress/redirect stderr,因为我想webbrowser选择默认浏览器。

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

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

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

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

还有什么能解决问题的...

4

1 回答 1

0

要在可能的解决方案中回答您的 (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

你说你不能这样做是因为你的进程结束了,但你可以在不替换旧标准错误的情况下这样做。

于 2014-10-16T21:46:24.033 回答