如何屏蔽子进程stdout与stderr且不影响主进程?并实时输出至指定文件?
子进程输出屏蔽与实时文件定向解决方案
一、屏蔽子进程的所有输出(不影响主进程)
注意:原代码中args=1是错误写法,multiprocessing.Process的args参数需要传入元组,应改为args=(1,)。以下提供两种实现方式:
方法1:在子进程函数内部重定向输出
直接在子进程函数开头,将标准输出(stdout)和标准错误(stderr)重定向到空设备:
import os import multiprocessing def f(x): # 重定向到空设备(Linux/macOS用/dev/null,Windows用'nul') dev_null = open(os.devnull, 'w') os.dup2(dev_null.fileno(), 1) # 替换stdout os.dup2(dev_null.fileno(), 2) # 替换stderr # 原函数逻辑 # ....do something.. # ....many print statements.... quit() if __name__ == '__main__': a = multiprocessing.Process(target=f, args=(1,)) a.start() # ....main process also has many print statement....
方法2:创建Process时指定输出目标
利用multiprocessing.Process的stdout和stderr参数,直接指定为subprocess.DEVNULL:
import multiprocessing import subprocess def f(x): # 原函数逻辑 # ....do something.. # ....many print statements.... quit() if __name__ == '__main__': a = multiprocessing.Process( target=f, args=(1,), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) a.start() # ....main process also has many print statement....
二、实时将子进程输出定向到指定文件
通过设置文件缓冲模式实现实时写入,避免程序崩溃时丢失数据:
方法1:函数内部重定向(灵活控制)
打开文件时设置buffering=1(文本模式行缓冲),确保每一行输出都实时写入文件:
import os import multiprocessing def f(x): # 打开日志文件,行缓冲模式 log_file = open('subprocess_log.log', 'a', buffering=1) os.dup2(log_file.fileno(), 1) os.dup2(log_file.fileno(), 2) # 原函数逻辑 # ....do something.. # ....many print statements.... quit() if __name__ == '__main__': a = multiprocessing.Process(target=f, args=(1,)) a.start() # ....main process also has many print statement....
方法2:创建Process时绑定文件对象
在主进程中打开文件,将文件对象传入子进程的stdout和stderr参数,注意要保持文件直到子进程结束再关闭:
import multiprocessing def f(x): # 原函数逻辑 # ....do something.. # ....many print statements.... quit() if __name__ == '__main__': # 若主进程需等待子进程结束,用with语句自动关闭文件 with open('subprocess_log.log', 'a', buffering=1) as log_file: a = multiprocessing.Process( target=f, args=(1,), stdout=log_file, stderr=log_file ) a.start() a.join() # ....main process also has many print statement....
若主进程不需要立即等待子进程结束,不要用
with语句(否则主进程退出with块会关闭文件,导致子进程写入失败),应手动管理文件生命周期:log_file = open('subprocess_log.log', 'a', buffering=1) a = multiprocessing.Process(target=f, args=(1,), stdout=log_file, stderr=log_file) a.start() # 主进程其他操作 a.join() log_file.close()
内容的提问来源于stack exchange,提问作者infiNity9819
相关产品推荐
相关产品推荐

