繁体   English   中英

如果控制台中已打印某些内容,则打印

[英]Print if something is printed in the console

我想在执行过程中监视给定Python函数(对于那些知道它的人,来自机器学习包Scikit Learn的GridSearchCV )的进度。 为此,在给定的函数具有参数verbose ,我可以将详细程度设置为1或10。 但是,我也想进行某种时间监视。 我的想法是每次在控制台中打印某些东西时,在控制台上打印一个计时器 (在这种情况下,打印将来自GridSearchCV的冗长程度的激活),我们称之为printing function

我的问题如下:

  • 在控制台中打印某些内容后,Python中是否有一种方法可以执行程序?
  • 我在这里看到的一个困难是,当我执行所有这些指令(函数GridSearchCVprinting function )时,恐怕将会发生的是GridSearchCV将被完全执行,然后所有计时器将在最后打印。 有办法避免这种情况吗?

通过将sys.stdout重定向到您自己的自定义类(可以将信息添加到输出中)可以实现。 这是如何实现的示例。 我传入了一个datetime对象,用作计算多少时间的参考。 然后,当将任何内容打印到stdout时,将调用CustomStdout.write() ,然后评估自参考时间以来经过了多少时间,并将该信息插入正在显示的文本中,然后使用初始stdout显示它。

import sys
import time

from datetime import datetime


class CustomStdout():
    def __init__(self, start_time=None):
        self.stdout = sys.stdout
        self.start_time = start_time or datetime.now()

    def write(self, text):
        elapsed = datetime.now() - self.start_time

        text = text.rstrip()
        if len(text) == 0:
            return

        elapsed_str = '[%d.%03d seconds]' % (elapsed.seconds, elapsed.microseconds / 1000.)
        self.stdout.write('%s %s\n' % (elapsed_str, text))


print 'Printing before stdout redirect'

# Redirect stdout
sys.stdout = CustomStdout()

print 'Stdout now redirected'
print 'About to sleep 5 seconds'
time.sleep(5)
print 'Slept 5 seconds'

输出是

Printing before stdout redirect
[0.000 seconds] Stdout now redirected
[0.000 seconds] About to sleep 5 seconds
[5.004 seconds] Slept 5 seconds

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM