2

この質問が Bash に関して回答されているのを見たことがありますが、Python の質問が見つかりません。これが何かを繰り返している場合は申し訳ありません。

1 つのコマンドで端末と出力ファイルに出力することは可能ですか? print >>と の使用には慣れていsys.stdout = WritableObjectますが、ログに記録する行ごとにコマンドを二重に出力する必要は避けたいと思います。

そのような知識が必要な場合に備えて、私はPython 2.6を使用しています。

さらに重要なことは、これを Windows ベースのシステムで IDLE のコマンド ラインを使用して実行したいということです。したがって、本質的には、Python スクリプトが IDLE の端末と特定のログ ファイルにレポートするようにします。

編集: これを見つけて、私が選んだ答えを採用することに決めた人には、(私がしたように) コンテキスト マネージャーを理解するのに助けが必要な場合は、明確化のために Doug Hellman の Python Modules of the Week をお勧めします。これは、コンテキスト ライブラリの詳細です。デコレータのヘルプについては、このスタック オーバーフローの質問の回答を参照してください。

4

3 に答える 3

6

を置き換えsys.stdoutます。

class PrintAndLog(object):
    def __init__(self, fileOrPath): # choose which makes more sense
        self._file = ...

    def write(s):
        sys.stdout.write(s)
        self._file.write(s)

    def close(self):
        self._file.close()
    # insert wrappers for .flush, .writelines

_old_stdout = sys.stdout
sys.stdout = PrintAndLog(f)
... # print and stuff
sys.stdout = _old_stdout

コンテキストマネージャーに入れることができます(これは、SOだけでこのようなものを見るのは少なくとも3回目です...):

from contextlib import contextmanager

@contextmanager
def replace_stdout(f):
    old_stdout = sys.stdout
    try:
        sys.stdout = PrintAndLog(f)
        yield
    finally:
        sys.stdout = old_stdout
于 2011-03-14T18:38:37.143 に答える
2

なぜ関数を書かないのですか?

def myPrint(anOpenFileObject, message):
    print message
    anOpenFileObject.write(message)
于 2011-03-14T18:38:13.560 に答える
0

Unix を使用している場合: プログラムの開始時に、名前付きパイプをmkfifoし、bg でそこから cat を起動して、ターミナルのティーと目的の出力ファイルに移動できます。次に、プログラム全体で、名前付きパイプの fd に出力します。最後に、終了する直前に名前付きパイプを rm します。

しかし、正直なところ、両方の宛先に出力する print のラッパーを作成するだけです。

于 2011-03-14T18:34:27.030 に答える