You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:20:36