我想通過我的Python程序過濾屏幕打印。
您可以使用Python的logging
模塊,路由所有打印和警告輸出通過它:
# in your main module
import logging
# -- log all output to myapp.log
logging.basicConfig(filename='myapp.log', level=logging.DEBUG)
# -- OR log all output to console
logging.basicConfig(level=logging.DEBUG)
# route all output to logging
logging.captureWarnings(True)
print = logging.info
有了這個添加自己的Filter
過濾所有輸出按照需要的關鍵字:
# define Filter in its own module, say logfilter.py
class OutputFilter(logging.Filter):
def __init__(self, keywords, name=None):
super(OutputFilter, self).__init__(name)
self.keywords = keywords
def filter(self, record):
msg = record.getMessage()
return not any(k in msg for k in self.keywords)
# add this in your main module
from logfilter import OutputFilter
flt = OutputFilter(['*FutureWarning*', 'INFO*'])
logger = logging.getLogger() # root logger
logger.addFilter(flt)
warnLogger = logging.getLogger('py.warnings') # warnings logger
warnLogger.addFilter(flt)
(...)沒有它,我需要通過不同類型的屏幕打印輸出並相應地處理它們。
如果你可以改變的源代碼,最好是經常使用的模塊記錄,而不是打印:
# in any module with output, right after imports
logger = logging.getLogger(__name__)
...
# instead of print
logger.info(...)
logger.error(...)
logger.debug(...)
的優點是logging
允許你在什麼輸出並在很精細的控制,同時從中心位置配置所有內容。例如,雖然上面使用適用於所有日誌記錄輸出的根日誌記錄器,但應用程序的每個模塊都可以擁有自己的記錄器,並具有其特定配置,例如,
# somewhere in your main module
# -- basic config is to console
logging.basicConfig(level=logging.DEBUG)
# -- module A output should go into its own file
logger = logging.getLogger('path.to.module.A')
handler = logging.FileHandler(filename='myapp-A.log') # see above
logger.setHandler(handler)
logger.setLevel(logging.INFO)
# path/to/module/A.py
# -- right at the top of the module
import logging
logger = logging.getLogger(__name__)
...
# in the actual code
logger.info('info message')
此示例將路由通過模塊A中的所有信息消息到文件myapp-A.log
而所有其它輸出變爲到終端。
注意:所有示例均從Python Logging Cookbook採用。請查看tutorial以獲得更深入的解釋。
「screen print」是什麼意思?您的描述似乎涉及通過各種渠道打印到共生輸出設備(通常是命令窗口)的消息,但術語不匹配。你的半個例子沒有給出足夠的細節以確定,問題的形式與SO的特異性標準並不相符。 – Prune
我想也許他正在尋找'grep -v -E「(列表|黑名單|字詞列表)」' – mbarkhau