python 如何禁用子进程stdout和stderr?

ffvjumwh  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(336)
def f(x) :
    ....do something..
    ....many print statements....
    quit()

a = Process(target=f, args=1)
a.start()
....main process also has many print statement....

如何在不关闭main函数的stdout的情况下,关闭新衍生函数f的所有print语句和error语句?此外,我是否可以将所有子函数的输出实时指向一个特定的文件(即,不存储在缓冲区中,然后保存,因为如果程序崩溃,缓冲区可能会丢失)?

nhaq1z21

nhaq1z211#

我建议使用redirect_stdoutredirect_stderr库,以便重定向子进程中运行的函数的所有输出。首先,创建一个装饰器工厂redirect_output,然后将其应用于目标函数,传递一个filename作为它的参数,其中您希望stdout和stderr被重定向到该工厂。下面是一个完整的工作示例:


# !/usr/bin/env python3

import sys
from functools import wraps
from contextlib import redirect_stdout, redirect_stderr
from multiprocessing import Process

def redirect_output(filename):

    def decorator(func):

        @wraps(func)
        def wrapper(*args,**kwargs):

            with open(filename, 'w') as f:
                with redirect_stdout(f), redirect_stderr(f):
                    return func(*args,**kwargs)

        return wrapper

    return decorator

@redirect_output('worker.log')
def worker(*args,**kwargs):
    print(f'stdout: worker {args}, {kwargs}')
    print(f'stderr: worker {args}, {kwargs}', file=sys.stderr)

if __name__ == '__main__':
    proc = Process(target=worker, args=(1, 2), kwargs={'foo': 'bar'})
    proc.start()

相关问题