Python 3.x 如何传递或包装print命令(stdout),以便print每次调用都调用一个函数?

Python 3.x 如何传递或包装print命令(stdout),以便print每次调用都调用一个函数?,python-3.x,stdout,Python 3.x,Stdout,我正在尝试自动化一个长时间运行的作业,并且我希望能够将所有控制台输出上传到另一个日志,比如CloudWatch日志。在大多数情况下,这可以通过制作和使用自定义函数而不是打印来实现。但是在机器学习中有一些函数,比如Model.summary()或训练时的进度条,它们自己输出到标准输出 我可以通过一个内部控制台日志在最后获得所有控制台输出。但我需要的是实时上传的标准输出,因为它的名称由任何人。因此,您可以通过查看Cloudwatch上的日志来检查进度,而不必登录机器并检查内部控制台日志 基本上我需要

我正在尝试自动化一个长时间运行的作业,并且我希望能够将所有控制台输出上传到另一个日志,比如CloudWatch日志。在大多数情况下,这可以通过制作和使用自定义函数而不是打印来实现。但是在机器学习中有一些函数,比如Model.summary()或训练时的进度条,它们自己输出到标准输出

我可以通过一个内部控制台日志在最后获得所有控制台输出。但我需要的是实时上传的标准输出,因为它的名称由任何人。因此,您可以通过查看Cloudwatch上的日志来检查进度,而不必登录机器并检查内部控制台日志

基本上我需要的是:

From: call_to_stdout -> Console(and probably other stuff)
To:   call_to_stdout -> uploadLog() -> Console(and probably other stuff)
我需要的伪代码

class stdout_PassThru:
   def __init__(self, in_old_stdout):
      self.old_stdout = in_old_stdout

   def write(self, msg):
      self.old_stdout.write(msg)
      uploadLogToCloudwatch(msg)

def uploadLogToCloudwatch(msg):
   # Botocore stuff to upload to Cloudwatch

myPassThru = stdout_PassThru(sys.stdout)
sys.stdout = myPassThru
我试过用谷歌搜索这个,但我得到的最好的东西是stringIO,我可以捕获标准输出,但我不能用它做任何事情,直到我调用的函数结束,我可以再次插入代码。我想在每次使用stdout时运行我的上传日志代码

这可能吗? 谢谢你


编辑:有人建议重定向/输出到文件。问题在于,在输出内容时,只对文件进行流式处理/写入。我需要调用一个函数,该函数在每次调用stdout时都会起作用,而stdout不是流。如果stdout每次刷新时都输出,那么调用函数也会很好。

我解决了我的问题。有点隐藏在其他答案中。 这个解决方案的最初问题是,当它在Jupyter笔记本中测试时,sys.stdout=myClass(sys.stdout)会导致Jupyter。。。等待不确定,但它从未完成段落处理

但当我将其放入python文件并使用python test.py运行时,它运行得非常完美,正如预期的那样

从某种意义上说,这允许我传递对print的调用,同时在每次调用print时执行自己的函数

def addLog(message):
    # my boto function to upload Cloudwatch logs

class sendToLog:
    def __init__(self, stream):
        self.stream = stream
    def write(self, o):
        self.stream.write(o)
        addLog(o)
        self.stream.flush()
    def writelines(self, o):
        self.stream.writelines(o)
        addLog(o)
        self.stream.flush()
    def __getattr__(self, attr):
        return getattr(self.stream, attr)

sys.stdout = sendToLog(sys.stdout)

这回答了你的问题吗?