为了防止这是一个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不会给我垃圾?
有没有办法去管道"浏览器的输出而不使用子进程?
还有其他可以解决问题的方法......
答案 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。