gpt4 book ai didi

python-3.x - 将 stdout 重定向到日志文件,同时仍然打印到 stdout?

转载 作者:行者123 更新时间:2023-12-03 22:33:56 26 4
gpt4 key购买 nike

我想在 Python 脚本末尾捕获控制台输出。也就是说,我既想正常打印到控制台,又想在执行结束时将控制台输出保存到文件中。

我看过各种相关的 SO 问题 1 , 2 , 3尽管他们要么简单地重定向输出而不显示它,要么使用 logging。从阅读 logging doc 可以看出您只能记录您编写的代码的输出。

上面所有链接的问题是您未编写的代码的控制台输出也打印到控制台。 我想要程序在执行结束时的整个控制台输出

我的第一 react 是

logFile = open('LogFile.txt', 'w')
def print_log(msg):
print(msg)
logFile.write(msg)

print_log('Hello World!')

logFile.close()

但这仍然无法从正在使用的其他代码和库中捕获控制台输出。 有没有办法在执行结束时保存 python 脚本的控制台输出?我觉得应该有一个简单的方法来做到这一点,但我的所有研究都没有找到合适的解决方案。

最佳答案

我在我的一个项目中使用过这个:

import io
import sys
from enum import Enum


class Tee(io.StringIO):
class Source(Enum):
STDOUT = 1
STDERR = 2

def __init__(self, clone=Source.STDOUT, *args, **kwargs):
super().__init__(*args, **kwargs)

self._clone = clone

if clone == Tee.Source.STDOUT:
self._out = sys.stdout
elif clone == Tee.Source.STDERR:
self._out = sys.stderr
else:
raise ValueError("Clone has to be STDOUT or STDERR.")

def write(self, *args, **kwargs):
self._out.write(*args, **kwargs)
return super().write(*args, **kwargs)

def __enter__(self):
if self._clone == Tee.Source.STDOUT:
sys.stdout = self
else:
sys.stderr = self
self.seek(io.SEEK_END)
return self

def __exit__(self, exc_type, exc_val, exc_tb):
if self._clone == Tee.Source.STDOUT:
sys.stdout = self._out
else:
sys.stderr = self._out
self.seek(0)
return False

基本上它完全符合 Maksym Markov 在评论中所说的,只是有一点不同。我通常不想停止任何输出,所以我写了这个 Tee,它捕获所有在 stdout(或 stderr)上进行的文本,立即打印它并保存到缓冲区以供以后使用。当代码退出 with block 时,它还负责“修复”sys.stdout

使用示例:

if __name__ == "__main__":
with Tee() as tee:
print("Hello World!")

print(tee.read())

有一些缺点,比如如果没有额外的代码,您就不能在 with block 中使用 tee.read()。但就我而言,我总是需要处理整个 block 的输出。

关于python-3.x - 将 stdout 重定向到日志文件,同时仍然打印到 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45450100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com