Python,记录打印语句,同时将它们打印到stdout

时间:2013-07-25 19:09:41

标签: python logging printing stdout

我有一个经常使用print语句的长python脚本,我想知道是否可以添加一些代码来将所有打印语句记录到文本文件或类似的东西中。当用户在整个程序中被提示时,我仍然希望所有的print语句都转到命令行。如果可能的话,记录用户的输入也是有益的。

我发现这有点回答了我的问题但却使“print”语句不再打印到命令行

Redirect Python 'print' output to Logger

5 个答案:

答案 0 :(得分:13)

您可以将其添加到您的脚本中:

import sys
sys.stdout = open('logfile', 'w')

这将使print语句写入logfile

如果您想要打印到stdout和文件,可以试试这个:

class Tee(object):
    def __init__(self, *files):
        self.files = files
    def write(self, obj):
        for f in self.files:
            f.write(obj)

f = open('logfile', 'w')
backup = sys.stdout
sys.stdout = Tee(sys.stdout, f)

print "hello world"  # this should appear in stdout and in file

要恢复只是打印到控制台,只需恢复“备份”

sys.stdout = backup

答案 1 :(得分:9)

这是一个执行你所描述的程序:

#! /usr/bin/python3

class Tee:
    def write(self, *args, **kwargs):
        self.out1.write(*args, **kwargs)
        self.out2.write(*args, **kwargs)
    def __init__(self, out1, out2):
        self.out1 = out1
        self.out2 = out2

import sys
sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout)

print("hello")

答案 2 :(得分:3)

如果你使用内置的logging module,你可以根据需要配置你的记录器输出:文件,数据库,电子邮件等。但是听起来你正在混合打印两种不同的用途:记录(记录程序流程以供以后检查)和提示。真正的工作是将“打印”这两种用法分开。分为不同的功能,让你在每个地方得到你需要的东西。

很多人replace python's generic sys.stdout and sys.stderr自动对发送到控制台的文本执行操作。真正的控制台输出始终存在于sys.__stdout__sys.__stderr__中(因此您不必担心某种情况会丢失它)但是如果你坚持使用相同的对象方法作为变量sys.stdoutsys.stderr中的文件,您可以使用输出过程执行任何操作。

答案 3 :(得分:1)

当尝试在python 3.7上接受的最佳答案时,我遇到以下异常:

    Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
    AttributeError: 'Logger' object has no attribute 'flush'

我添加了以下功能以使其正常工作:

    def flush(self):
        pass

答案 4 :(得分:-1)

hm ...难以实现自己的print()函数和装饰器,它会记录传递给打印函数的任何内容吗?

def logger(func):
    def inner(*args, **kwargs):
        log(*args, **kwargs)  # your logging logic
        return func(*args, **kwargs)
    return inner

@logger
def lprint(string_to_print):
    print(string_to_print)