簡體   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