如何在Jupyter Notebook中屏蔽tsfresh库extract_features等类的输出?
解决tsfresh的extract_features/select_features输出无法屏蔽的问题
我之前也踩过tsfresh这两个函数的输出坑——明明想安安静静跑代码,它们的输出却占满Notebook,还拖慢运行速度,而且官方居然没给屏蔽参数!结合你的情况,分享几个亲测有效的解决办法:
方法1:临时重定向系统输出流(最稳妥)
如果%%capture不管用,大概率是这些函数直接操作了sys.stdout/sys.stderr,绕过了IPython的捕获机制。我们可以写一个上下文管理器,临时把输出重定向到"空设备",用完再恢复:
import sys import os from contextlib import contextmanager @contextmanager def suppress_tsfresh_output(): # 保存原始的输出流 original_stdout = sys.stdout original_stderr = sys.stderr try: # 跨平台的空设备路径(Windows用nul,Linux/macOS用/dev/null) null_device = os.devnull with open(null_device, 'w') as dev_null: sys.stdout = dev_null sys.stderr = dev_null yield # 这里执行要屏蔽输出的代码 finally: # 恢复原始输出流,不影响后续代码 sys.stdout = original_stdout sys.stderr = original_stderr
使用方式很简单,把调用tsfresh函数的代码包在这个上下文里:
from tsfresh import extract_features, select_features # 屏蔽输出执行特征提取和选择 with suppress_tsfresh_output(): extracted_features = extract_features(your_input_data, column_id="id", column_sort="time") selected_features = select_features(extracted_features, your_target_labels)
方法2:调整tsfresh的日志级别(更优雅)
你说没找到库文件里的print语句,那这些输出很可能是用Python的logging模块打出来的。tsfresh内部大量使用日志输出过程信息,我们只需要把它的日志级别调高,就能屏蔽INFO级别的冗余输出:
import logging # 把tsfresh的日志级别设为WARNING,只显示警告和错误信息 logging.getLogger('tsfresh').setLevel(logging.WARNING)
如果还想更彻底,直接设为logging.ERROR,就只会显示严重错误了。这个方法不需要额外封装代码,适合全局屏蔽tsfresh的日志输出。
方法3:用IPython的高级捕获工具
如果上面两种方法都不生效,可以试试IPython内置的capture_output,它比%%capture更底层,能捕获更多类型的输出:
from IPython.utils.capture import capture_output with capture_output() as captured: # 在这里执行tsfresh的函数 extracted_features = extract_features(your_input_data, ...) # captured变量会存储捕获到的输出,但不会在Notebook里显示
为什么%%capture没用?
%%capture主要捕获的是IPython自己的输出缓冲区,但有些库函数会直接写入系统级的sys.stdout/sys.stderr,或者用第三方日志库输出,这些是%%capture管不到的,所以需要用上面更直接的方法。
内容的提问来源于stack exchange,提问作者Leedoe
相关产品推荐
相关产品推荐

