将输出重定向并复制到日志文件
您渴望实现命令行“tee”实用程序的功能,其中所有输出由 Python 应用程序生成的数据(包括系统调用输出)会复制到日志中file.
重定向
您最初的方法是将 sys.stdout 和 sys.stderr 的文件描述符复制到日志文件,这成功地将输出重定向到日志守护进程模式。但是,此方法在交互模式下存在不足,因为它阻碍了屏幕上输出的并发显示。
复制
要实现复制,只需反转 dup2 调用即可不够。相反,您可以采用一种技术来拦截 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()
此类封装了文件描述符重复,并提供了一种无缝的方式来写入两者sys.stdout 和日志文件。您可以初始化 Tee 的实例并将日志文件详细信息作为参数传递。然后该实例就成为新的sys.stdout。
结论
通过使用此方法,可以同时实现重定向(守护进程模式)和复制(交互模式) )将所有应用程序输出(包括系统调用输出)保存到日志文件中。
以上是如何将 Python 应用程序输出(包括系统调用)复制到控制台和日志文件?的详细内容。更多信息请关注PHP中文网其他相关文章!