質問

画面メッセージを色付けするための次の機能があります。

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top