web-dev-qa-db-ja.com

印刷をログファイルにリダイレクトする

はい。最初のpythonプログラムを完了しました。約1000行のコードがあります。開発中、os.system()を使用してコマンドを実行する前にprintステートメントをたくさん配置しました何か言って

print "running command",cmd
os.system(cmd)

これでプログラムが完了しました。私はそれらをコメントすることを考えましたが、これらすべての不要な印刷(すべてのprintステートメントを削除することはできません-一部はユーザーに役立つ情報を提供するため)をログファイルにリダイレクトする方が便利ですか?トリックやヒント。

27
webminal.org

Pythonでは、前述のようにsys.stdoutをキャプチャして割り当てることができます。

import sys
old_stdout = sys.stdout

log_file = open("message.log","w")

sys.stdout = log_file

print "this will be written to message.log"

sys.stdout = old_stdout

log_file.close()
44
Michael

python logging module をご覧ください


編集:サンプルコード:

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+",
                        format="%(asctime)-15s %(levelname)-8s %(message)s")
    logging.info("hello")

コンテンツを含む「logfile」という名前のファイルを作成します。

2012-10-18 06:40:03,582 INFO     hello
48
user180100
  • 次回は、printステートメントを使用する代わりに、最初からloggingモジュールを使用する方が幸せです。それはあなたが望むコントロールを提供し、それがあなたがそれを望むところにある間にstdoutにそれを書かせることができます。

  • ここの多くの人々は、stdoutのリダイレクトを提案しています。 これはい解決策です。グローバルを変更し、さらに悪いことに、この1つのモジュールの使用に合わせて変更します。私はすぐにすべてを変更する正規表現を作成しますprint fooからprint >>my_file, fooと設定my_file stdoutまたは選択した実際のファイルのいずれか。

    • 実際に stdoutへの書き込みに依存するアプリケーションの他の部分がある場合(または将来的にはそうなるが、まだ知らない)、これはそれらを壊します。そうしなくても、モジュールの読み取りは、1行上の小さな行を逃した場合に実際に別のことを行うときに1つのことを行うように見えます。
    • シェブロンプリントはかなりいですが、一時的に変更するほどnearlyくはありませんsys.stdoutプロセス用。
    • 非常に技術的に言えば、正規表現の置換はこの権利を果たすことができません(たとえば、複数行の文字列リテラルの内部にいる場合、誤検知を起こす可能性があります)。ただし、動作しやすいので、注意してください。
  • os.systemは、実質的に常にsubprocessモジュールの使用より劣ります。後者は、シェルを呼び出す必要はなく、通常は望ましくない方法で信号を渡しません。また、ブロックしない方法で使用できます。

8
Mike Graham

Loggingモジュールを使用してstdoutとstderrをリダイレクトする簡単な方法は次のとおりです。 pythonでsys.stdoutをログファイルに複製するにはどうすればよいですか。

2
blokeley

ログファイルを作成し、書き込みの準備をすることができます。次に、関数を作成します。

def write_log(*args):
    line = ' '.join([str(a) for a in args])
    log_file.write(line+'\n')
    print(line)

次に、print()関数名をwrite_log()に置き換えます

2
AisZuk

Sys.stdoutをリダイレクトして、sys.stdoutと同じインターフェイスを持つ任意のオブジェクトに置き換えることができます。そのオブジェクトの書き込みでは、端末およびファイルにも印刷できます。例えばこのレシピを参照してください http://code.activestate.com/recipes/119404-print-hook/

2
Anurag Uniyal

sys.stdoutに独自のファイルのように配置すると、printを介してテキスト出力をキャプチャできます。

追加モードと書き込みモードについてのメモです。ログファイルを置き換える場合は、ファイルモードを「w」に変更します。また、ストリームをコメントアウトする必要がありました。その後、logging.info()を使用して、指定されたファイルに出力していました。

if __name__ == '__main__':
    LOG_FORMAT = '%(asctime)s:%(levelname)s ==> %(message)s'
    logging.basicConfig(
        level=logging.INFO,
        filename="logfile",
        filemode="w",
        format=LOG_FORMAT
        #stream=sys.stdout
    )
0
Chris Adams