Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在启用或禁用详细性的情况下,将标准输出重定向到控制台和文件_Python_Stdout_Verbosity - Fatal编程技术网

Python 在启用或禁用详细性的情况下,将标准输出重定向到控制台和文件

Python 在启用或禁用详细性的情况下,将标准输出重定向到控制台和文件,python,stdout,verbosity,Python,Stdout,Verbosity,我写了一些代码只是为了在python中练习冗长。详细信息通过ArgumentParser模块嵌入。但是,我也希望在禁用详细性时将stdout写入文件: #!/usr/bin/python import sys def printable1(): print "1" def printable2(): print "2" def printable3(

我写了一些代码只是为了在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
参数启用详细性时才将标准输出写入文件。您能帮我找到一个解决方案吗?

您可以使用该模块处理打印到终端并写入文件的操作,而不是重新发明轮子。细节部分仍由您决定:

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')

另外,我建议使用来处理注册日志记录程序和处理程序-这是一种更具声明性的替代方法(您仍然需要像上面那样实例化
log
对象)。

我已经清理了您的代码,只包括相关行(删除所有注释代码、额外的空白和未使用的导入);如果您的示例只包含重现问题所需的代码,我们将更容易为您提供帮助。谢谢您,Martjin,我将在未来处理它。我再次道歉。