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