gpt4 book ai didi

python - 如何将 sys.stdout 复制到日志文件?

转载 作者:IT老高 更新时间:2023-10-28 12:29:28 26 4
gpt4 key购买 nike

编辑:因为似乎没有解决方案,或者我正在做一些不标准的事情以至于没人知道 - 我会修改我的问题来问:当 python 应用程序完成日志记录的最佳方法是什么是在做很多系统调用吗?

我的应用有两种模式。在交互模式下,我希望所有输出到屏幕以及日志文件,包括来自任何系统调用的输出。在守护程序模式下,所有输出都进入日志。守护程序模式使用 os.dup2() 效果很好。在不修改每个系统调用的情况下,我无法找到一种方法将所有输出“发送”到交互模式的日志中。


换句话说,我想要命令行 'tee' 的功能用于 python 应用程序生成的任何输出,包括系统调用输出

澄清一下:

为了重定向所有输出,我做了这样的事情,效果很好:

# open our log file
so = se = open("%s.log" % self.name, 'w', 0)

# re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

这样做的好处是它不需要来自其余代码的特殊打印调用。该代码还运行一些 shell 命令,因此不必单独处理它们的每个输出也很好。

简单地说,我也想做同样的事情,除了 复制 而不是重定向。

起初,我认为简单地反转 dup2 应该可以。为什么不呢?这是我的测试:

import os, sys

### my broken solution:
so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())
###

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

文件“a.log”应该与屏幕上显示的相同。

最佳答案

我之前也遇到过同样的问题,发现这段代码非常有用:

class Tee(object):
def __init__(self, name, mode):
self.file = open(name, mode)
self.stdout = sys.stdout
sys.stdout = self
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
def flush(self):
self.file.flush()

来自:http://mail.python.org/pipermail/python-list/2007-May/438106.html

关于python - 如何将 sys.stdout 复制到日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/616645/

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