0

Pythonで冗長性を練習するためだけにいくつかのコードを書きました。冗長性は、ArgumentParserモジュールによって埋め込まれます。stdoutただし、冗長性が無効になっている場合にもファイルに書き込みたいと思います。

#!/usr/bin/python                                                               
import sys

def printable1():
    print "1"

def printable2():
    print "2"

def printable3():
    print "3"

def Main1():
    printable1()
    printable2()

def Main2():
    printable2()
    printable3()

class Logger(object):
    def __init__(self):
        self.terminal = sys.stdout
        self.log = open("logfile2.log", "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)


if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser(description='PC Test',version="1.0")
    parser.add_argument('--nopc',action='store_true', help='Do not perform test on the PC')
    parser.add_argument('--pc', action='store_true', help='Do perform test on the PC')

    # VERBOSITY 
    parser.add_argument('--vmode', dest='verbose', action='store_true',
                        help='Enable printing of status messages to stdout.')

    args = parser.parse_args()

    sys.stdout = Logger()

    if args.verbose:
        if args.pc:       
            Main1()
        elif args.nopc:
            Main2()
        else:
            Main1()
            Main2()  

--vmodeこのコードは、引数で冗長性が有効になっている場合にのみ、stdout をファイルに書き込みます。解決策を見つけるのを手伝ってもらえますか?

4

1 に答える 1

1

車輪を再発明する代わりに、ロギングモジュールを使用して、端末への出力とファイルへの書き込みを処理できます。冗長な部分はまだあなた次第です:

import logging
import logging.handlers
log = logging.getLogger(__name__)
log.addHandler(logging.StreamHandler())  # Prints to console.
log.addHandler(logging.handlers.RotatingFileHandler('logfile2.log'))
log.setLevel(logging.INFO)  # Set logging level here.

これ以降、その通常のlogオブジェクトを使用してスクリプトでロギングを実行でき、エントリはコンソールとファイルの両方に送信されます。

log.info('test')
log.warning('test')

また、ロガーとハンドラーの登録を処理するためにConfigDictlogを使用することをお勧めします。これは、上記の方法のより宣言的な代替手段です (上記のようにオブジェクトをインスタンス化する必要があります)。

于 2014-03-01T18:55:06.100 に答える