在文件中写入打印日志时,Python子进程在屏幕缓冲区中延迟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在文件中写入打印日志时,Python子进程在屏幕缓冲区中延迟相关的知识,希望对你有一定的参考价值。

下面是我的脚本,它使用下面的示例调用另一个脚本,并在执行完成后生成整个输出,同时期望它应该生成实时输出以及同时写入文件。 发生的事情是它不是逐行产生输出并最终打印整个输出。

./My_Tests.py ALL
TC 1 : PASSED
TC 2 : PASSED
Tatal Passed Tests : 2
Tatal Failed Tests : 0 

my_tests.朋友 :

from subprocess import Popen, PIPE, STDOUT
with Popen("./tests.py", stdout=PIPE, stderr=STDOUT, bufsize=1, universal_newlines=True) as p,   
    open('tests.log', 'ab') as file:  
    for line in p.stdout: # b'
'-separated lines  
        print(line, end='') #new addition  
        sys.stdout.buffer.write(line)  
        file.write(line)  

我也尝试使用下面的命令,但它只在终端上打印而不保存文件中的输出。 导入子流程

# Run command and redirect it by | tee to a file named out.txt 
p = subprocess.Popen([command, '|', 'tee', 'out.txt'])
p.wait()
答案

问题和解决方案是什么: 我的tests.py文件有很多打印语句,我做错了:

  • 我在上面的代码中直接调用了tests.py文件,导致整个文件显然执行然后打印输出。

这是我做的: 1.为上面的子进程代码创建了一个函数。 2.为tests.py中的每个代码部分创建函数,并生成n个tests-n.py 3.然后一个接一个地调用子进程函数代码中的thiese tests-n.py。父文件现在是tests.py

    from subprocess import Popen, PIPE, STDOUT  

    def logc(file, logfile):
    with Popen(file, stdout=PIPE, stderr=STDOUT, bufsize=1, universal_newlines=True) as p,   
        open(logfile, 'ab') as file:  
        for line in p.stdout: # b'
'-separated lines  
            print(line, end='') #new addition  
            sys.stdout.buffer.write(line)  
            file.write(line)  

    os.system("> logs.py")
    logc("tests1.py", "logs.py")
    logc("tests2.py", "logs.py")
    logc("tests3.py", "logs.py")
    logc("tests3.py", "logs.py")

以上是关于在文件中写入打印日志时,Python子进程在屏幕缓冲区中延迟的主要内容,如果未能解决你的问题,请参考以下文章

python日志打印和写入并发简易版本实现

阻止写入标准输出

在将输出写入文件时使用多处理显示来自子进程的实时输出

Python子进程显示在终端上登录并保存在文件中

子进程写入文件时经常检查文件

Python + logging 输出到屏幕,将log日志写入文件