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 ターミナル (ヘッドレス モード) で使用すると、サブプロセスの側面により、Web ブラウザーの非常に優れた機能であるヘッドレス ターミナル ブラウザーを表示できません。

2 stderr をリダイレクトする

Pythonスクリプトは通常、Webブラウザーの印刷が完了する前に終了するため、Pythonでstderrをリダイレクトすることはできません。そのため、Webブラウザーのプロセスは、スクリプトが終了した後もターミナルで印刷を続けます。

私も試しました:モジュールの出力をライブラリ外で呼び出しているのをうまく抑制できない

デフォルトのブラウザーを選択したいので、 python webbrowserを呼び出すときに stderr を抑制/リダイレクトします。webbrowser

考えられる解決策 (これらの 1 つだけで十分です):

ヘッドレス モードかどうかを知る方法はありますか? 自分が ssh/ヘッドレス モードであることがわかっていれば、1 つの方法をヘッドレス モードに使用し、もう 1 つの方法を非ヘッドレス モードに使用できます。

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

厄介な環境では、これは常に設定されているとは限りませんが、設定する必要があります。

stderrをリダイレクトするには、次のことができると思います:

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

プロセスがいつ終了するかという理由でこれを行うことはできないと言いますが、古い stderr を置き換えずにこれを行うことができるかもしれません。

于 2014-10-16T21:46:24.033 に答える