ANSIカラーコードの削除中にstdoutとログファイルに印刷
-
04-10-2019 - |
質問
画面メッセージを色付けするための次の機能があります。
def error(string):
return '\033[31;1m' + string + '\033[0m'
def standout(string):
return '\033[34;1m' + string + '\033[0m'
私はそれらを次のように使用します:
print error('There was a problem with the program')
print "This is normal " + standout("and this stands out")
ANSIカラーコードなしで出力を(stdoutに加えて)ファイルにログインしたいと思います。 print
声明。
その理由は、あなたが単にその場合です python program.py > out
次に、ファイル out
ANSIカラーコードがあります。これは、プレーンテキストエディターで開くとひどいように見えます。
何かアドバイス?
解決
sys.stdout.isatty
機能が役立つ可能性があります:
from sys import stdout
def error(string, is_tty=stdout.isatty()):
return ('\033[31;1m' + string + '\033[0m') if is_tty else string
def standout(string, is_tty=stdout.isatty()):
return ('\033[34;1m' + string + '\033[0m') if is_tty else string
それは実際には、設定されていないデフォルトの引数を使用するために私が考えることができる数少ない用途の1つです None
デフォルトの引数は、C ++のように実行時ではなく、Pythonのコンパイル時間で評価されるため...
また、実際に必要な場合は、動作を明示的に上書きすることができますが、リダイレクトされたときにstdout自体を操作することはできません。あなたが使用していない理由はありますか logging
モジュール(おそらくあなたはそれについて知らなかった)?
他のヒント
端末とログファイルの両方に印刷する場合は、ロギングモジュールを使用することをお勧めします。カスタムフォーマッタを定義することもできるため、ファイルにログすると、端末コードをパージできます。
import optparse
import logging
def error(string):
return '\033[31;1m' + string + '\033[0m'
def standout(string):
return '\033[34;1m' + string + '\033[0m'
def plain(string):
return string.replace('\033[34;1m','').replace('\033[31;1m','').replace('\033[0m','')
if __name__=='__main__':
logging.basicConfig(level=logging.DEBUG,
format='%(message)s',
filemode='w')
logger=logging.getLogger(__name__)
def parse_options():
usage = 'usage: %prog [Options]'
parser = optparse.OptionParser()
parser.add_option('-l', '--logfile', dest='logfile',
help='use log file')
opt,args = parser.parse_args()
return opt,args
opt,args=parse_options()
if opt.logfile:
class MyFormatter(logging.Formatter):
def format(self,record):
return plain(record.msg)
fh = logging.FileHandler(opt.logfile)
fh.setLevel(logging.INFO)
formatter = MyFormatter('%(message)s')
fh.setFormatter(formatter)
logging.getLogger('').addHandler(fh)
logger.info(error('There was a problem with the program'))
logger.info("This is normal " + standout("and this stands out"))
test.py
ターミナルにのみ印刷します。
test.py -l test.out
ターミナルとファイルの両方に印刷します test.out
.
すべての場合において、端末へのテキストにはカラーコードがありますが、ロギングには何もありません。
以下のUNUBTUの回答は素晴らしいですが、MyFormation()メソッドでフォーマットを実施するためにマイナーな変更が必要だと思います
class MyFormatter(logging.Formatter):
def format(self,record):
msg = super(MyFormatter, self).format(record)
return plain(msg)