Windows下Jupyter Notebook中子进程print输出无法显示的解决问询
解决Jupyter Notebook中torch多进程子进程输出不显示的问题
问题原因
Windows系统中,torch.multiprocessing创建的子进程标准输出(stdout)默认关联启动Jupyter的控制台(如Anaconda提示符),而非Notebook的输出单元格,因此子进程的print内容只会出现在黑窗口,不会显示在Notebook里。
解决方案
方法1:用队列传递子进程输出
通过多进程队列让子进程把输出内容传递给主进程,再由主进程打印到Notebook中。
修改.ipynb文件内容如下:
from tasks import task import torch.multiprocessing as mp import sys def wrapped_task(queue): # 自定义输出类,将内容写入队列 class QueueWriter: def __init__(self, q): self.q = q def write(self, msg): self.q.put(msg) def flush(self): pass sys.stdout = QueueWriter(queue) task() sys.stdout = sys.__stdout__ # 恢复原标准输出 if __name__ == '__main__': print('Hello from main process') queue = mp.Queue() process = mp.Process(target=wrapped_task, args=(queue,)) process.start() # 读取队列内容并打印 while True: try: msg = queue.get(timeout=2) print(msg, end='') except mp.queues.Empty: break process.join() print('Hello again from main process')
tasks.py保持不变,子进程的print内容会通过队列传递到主进程,最终显示在Notebook输出单元格中。
方法2:重定向子进程输出到主进程文件描述符
直接让子进程的输出写入主进程的标准输出流,实现内容同步显示:
from tasks import task import torch.multiprocessing as mp import os import sys def wrapped_task(fd): # 重定向子进程stdout到主进程的文件描述符 sys.stdout = os.fdopen(fd, 'w') task() sys.stdout.close() if __name__ == '__main__': print('Hello from main process') # 复制主进程stdout的文件描述符 fd = os.dup(sys.stdout.fileno()) process = mp.Process(target=wrapped_task, args=(fd,)) process.start() process.join() os.close(fd) print('Hello again from main process')
验证效果
运行修改后的Notebook代码,输出将变为:
Hello from main process Hello from child process Hello again from main process
内容的提问来源于stack exchange,提问作者user13474103
相关产品推荐
相关产品推荐

