如何在Jupyter交互式终端中删除并行进程的特定打印语句?
解决方案
方法1:修改进程内输出逻辑,直接过滤无关内容
不用原生print,封装一个只放行"finished"相关内容的输出函数:
def filtered_print(msg): if 'finished' in msg: print(msg) def process(i): # 用filtered_print替代原print,不会输出starting语句 filtered_print('starting process number %s' %i) # ... do something ... filtered_print('finished process number %s' %i) return
如果不想修改原函数的print调用,可临时替换全局print:
original_print = print def filtered_print(msg, *args, **kwargs): if 'finished' in str(msg): original_print(msg, *args, **kwargs) # 启动进程前替换print print = filtered_print # 运行你的并行进程代码... # 用完后恢复原print print = original_print
方法2:用队列统一收集并过滤输出
借助多进程Queue,让进程把输出发往队列,主进程仅提取并打印"finished"内容:
from multiprocessing import Process, Queue def process(i, q): q.put('starting process number %s' %i) # ... do something ... q.put('finished process number %s' %i) return def print_finished(q): while True: msg = q.get() if msg is None: # 用None作为结束信号 break if 'finished' in msg: print(msg) if __name__ == '__main__': q = Queue() processes = [] # 启动工作进程 for i in range(5): p = Process(target=process, args=(i, q)) processes.append(p) p.start() # 启动输出处理进程 printer = Process(target=print_finished, args=(q,)) printer.start() # 等待工作进程结束 for p in processes: p.join() # 发送结束信号 q.put(None) printer.join()
方法3:捕获Jupyter单元格输出后过滤
在Jupyter中捕获单元格输出,过滤后仅保留需要的内容:
from io import StringIO import sys # 捕获输出 old_stdout = sys.stdout captured_output = StringIO() sys.stdout = captured_output # 运行你的并行进程代码... # 恢复标准输出 sys.stdout = old_stdout # 过滤并打印结果 output_lines = captured_output.getvalue().split('\n') for line in output_lines: if 'finished' in line and line.strip(): print(line)
内容的提问来源于stack exchange,提问作者patrick7
相关产品推荐
相关产品推荐

