在文件

时间:2017-12-26 07:22:52

标签: logging subprocess python-3.5

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

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

My_Tests.py:

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'\n'-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()

1 个答案:

答案 0 :(得分:0)

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

  • 我在上面的代码中直接调用了test.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'\n'-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")