如何在Python多进程中重写print输出功能
让多进程中的print也使用自定义输出处理
Python的多进程(multiprocessing)会创建独立的子进程,每个子进程拥有自己独立的Python运行环境,主进程中对sys.stdout的替换操作不会自动传递给子进程,所以子进程里的print还是会使用默认的标准输出。
要解决这个问题,核心是在每个子进程启动时重新初始化自定义的输出处理类,具体可以通过multiprocessing.Pool的initializer和initargs参数实现,让进程池中的每个子进程启动时都执行初始化操作。
修改后的代码示例
import multiprocessing as mp import sys import time class AlternativePrinter: def __init__(self): self.old_stdout = sys.stdout sys.stdout = self def write(self, text): # 避免空文本前添加标识,减少多余换行 if text.strip(): self.old_stdout.write("[write to terminal]" + text) else: self.old_stdout.write(text) def __enter__(self): return self def __exit__(self, type, value, traceback): sys.stdout = self.old_stdout def flush(self): self.old_stdout.flush() # 子进程初始化函数:每个子进程启动时启用自定义打印机 def init_printer(): AlternativePrinter() def wait_and_print(seconds): time.sleep(seconds) print("I waited for", seconds, "seconds") return seconds if __name__ == "__main__": with AlternativePrinter(): print('Initiating simultaneous processes:') # 创建进程池时指定初始化函数 pool = mp.Pool(4, initializer=init_printer) input = [(4,),(2,)] results = pool.starmap(wait_and_print, input) pool.close() pool.join() for result in results: print(result)
效果说明
修改后,子进程中的print输出也会被AlternativePrinter处理,最终输出如下:
[write to terminal]Initiating simultaneous processes: [write to terminal] [write to terminal]I waited for 2 seconds [write to terminal]I waited for 4 seconds [write to terminal]4 [write to terminal] [write to terminal]2 [write to terminal]
其他可选思路
- 若不使用进程池,手动创建
Process对象时,可在子进程执行的函数开头手动实例化AlternativePrinter,或用with AlternativePrinter():包裹需要自定义输出的代码块。 - 进程池场景下,子进程结束后会自动销毁,无需额外恢复原
sys.stdout;若需在子进程中临时使用自定义输出,记得用上下文管理器(with语句)来自动恢复。
内容的提问来源于stack exchange,提问作者aloea
相关产品推荐
相关产品推荐

