はい。最初のpythonプログラムを完了しました。約1000行のコードがあります。開発中、os.system()
を使用してコマンドを実行する前にprint
ステートメントをたくさん配置しました何か言って
print "running command",cmd
os.system(cmd)
これでプログラムが完了しました。私はそれらをコメントすることを考えましたが、これらすべての不要な印刷(すべてのprint
ステートメントを削除することはできません-一部はユーザーに役立つ情報を提供するため)をログファイルにリダイレクトする方が便利ですか?トリックやヒント。
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()
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
次回は、print
ステートメントを使用する代わりに、最初からlogging
モジュールを使用する方が幸せです。それはあなたが望むコントロールを提供し、それがあなたがそれを望むところにある間にstdoutにそれを書かせることができます。
ここの多くの人々は、stdoutのリダイレクトを提案しています。 これはい解決策です。グローバルを変更し、さらに悪いことに、この1つのモジュールの使用に合わせて変更します。私はすぐにすべてを変更する正規表現を作成しますprint foo
からprint >>my_file, foo
と設定my_file
stdoutまたは選択した実際のファイルのいずれか。
sys.stdout
プロセス用。os.system
は、実質的に常にsubprocess
モジュールの使用より劣ります。後者は、シェルを呼び出す必要はなく、通常は望ましくない方法で信号を渡しません。また、ブロックしない方法で使用できます。
Loggingモジュールを使用してstdoutとstderrをリダイレクトする簡単な方法は次のとおりです。 pythonでsys.stdoutをログファイルに複製するにはどうすればよいですか。
ログファイルを作成し、書き込みの準備をすることができます。次に、関数を作成します。
def write_log(*args):
line = ' '.join([str(a) for a in args])
log_file.write(line+'\n')
print(line)
次に、print()関数名をwrite_log()に置き換えます
Sys.stdoutをリダイレクトして、sys.stdoutと同じインターフェイスを持つ任意のオブジェクトに置き換えることができます。そのオブジェクトの書き込みでは、端末およびファイルにも印刷できます。例えばこのレシピを参照してください http://code.activestate.com/recipes/119404-print-hook/
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
)