首页 >后端开发 >Python教程 >如何将 Python 的 sys.stdout 复制到日志文件,包括系统调用输出?

如何将 Python 的 sys.stdout 复制到日志文件,包括系统调用输出?

Patricia Arquette
Patricia Arquette原创
2024-11-27 06:04:14418浏览

How to Duplicate Python's sys.stdout to a Log File, Including System Call Output?

将 sys.stdout 复制到日志文件

在这个编程难题中,目标是复制 Python 应用程序的所有输出,包括系统调用输出到单独的日志文件。然而,事实证明此任务对用户来说具有挑战性。

最初,用户尝试通过颠倒 dup2 调用顺序来解决问题,但无济于事。下面的代码演示了他们不成功的尝试:

import os, sys

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”应该包含与屏幕上显示的相同的输出,但事实并非如此。

解决方案

幸运的是,这个问题有一个解决方案。下面的代码提供了一个名为 Tee 的类,它成功地将 sys.stdout 复制到指定的日志文件:

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

该类允许用户创建 Tee 实例并指定日志文件的名称和模式。随后,sys.stdout 被重定向到 Tee 实例,有效地将所有输出复制到日志文件,同时仍然保留屏幕上的输出。

以上是如何将 Python 的 sys.stdout 复制到日志文件,包括系统调用输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn