Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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_Logging_Printing_Stdout - Fatal编程技术网

Python,记录打印语句,同时将它们打印到标准输出

Python,记录打印语句,同时将它们打印到标准输出,python,logging,printing,stdout,Python,Logging,Printing,Stdout,我有一个很长的python脚本,经常使用print语句,我想知道是否可以添加一些代码,将所有print语句记录到文本文件或类似文件中。在整个程序中,当用户收到提示时,我仍然希望所有的print语句都转到命令行。如果可能的话,记录用户的输入也是有益的 我发现这在某种程度上回答了我的问题,但使“print”语句不再打印到命令行 您可以将以下内容添加到脚本中: import sys sys.stdout = open('logfile', 'w') 这将使打印语句写入日志文件 如果您想要打印到std

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

我发现这在某种程度上回答了我的问题,但使“print”语句不再打印到命令行


您可以将以下内容添加到脚本中:

import sys
sys.stdout = open('logfile', 'w')
这将使打印语句写入
日志文件

如果您想要打印到
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
要恢复到仅打印到控制台,只需恢复“备份”


下面是一个程序,它实现了您所描述的功能:

#! /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")
如果您使用内置的,您可以根据需要为记录器配置尽可能多的输出:文件、数据库、电子邮件等。不过,听起来您将打印混合用于两种不同的用途:记录(记录程序流以供以后检查)和提示。真正的工作将是将“打印”的这两种用途分成不同的功能,以便在每个地方都能得到所需的内容


很多人会自动处理发送到控制台的文本。真正的控制台输出总是存在于
sys.\uuu stdout\uuuu
sys.\uu stderr\uuuuu
中(因此您不必担心会以某种方式“丢失”它)但是,如果您使用与文件相同的方法将任何对象粘贴到变量
sys.stdout
sys.stderr
中,您可以对输出过程执行任何操作。

hm。。。实现自己的print()函数和将记录传递给print函数的任何内容的decorator是否困难

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)   

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

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

@抢劫ᵩ @斯蒂芬-我觉得我一点都不好笑。“我在试图了解OP到底想从我们这里得到什么。”罗布ᵩ 我想他是在问如何让
print“hi”
用一个语句去两个不同的地方为什么你们都使用一个类,为什么他们都叫
Tee
?我使用了一个类,因为
print
最终会调用
sys.stdout.write()
。因为我正在替换
sys.stdout
,所以我的替换需要有一个
.write()
。我在the之后称它为
Tee
,它本身就是以.interest命名的。您是否也独立运行我的程序,而不使用任何代码?它是否生成了一个非空的
/tmp/log.txt
,然后?@reddman-您可以尝试将
self.out1.flush()
self.out2.flush()
添加到
Tee.write():
    Exception ignored in: <__main__.Logger object at 0x7f04083760f0>
    AttributeError: 'Logger' object has no attribute 'flush'
    def flush(self):
        pass