实时编写/读取外部命令的输出流

时间:2017-11-07 09:24:12

标签: python-3.x stream subprocess output

我被要求在Jenkins作业中运行python脚本,该作业通过subprocess包调用外部命令。在Jenkins控制台中,外部命令的输出应该实时打印或/和写入日志文件。

我发现了一篇关于实时打印的SO帖子:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
while True:
    line = p.stdout.readline()
    print (line)
    if not line and p.poll() is not None:
        break

所以我创建了一个执行外部命令的函数:

def execute_cmd(command, splitlines=True, timeout=None, output_stream=None):

    pipe = Popen(command, stdout=PIPE, stderr=PIPE)

    utf8_output = []
    while True:
        line = pipe.stdout.readline()
        utf8_output.append(line)
        # Add to stream here
        if output_stream:
            output_stream.write(line)
        if not line and pipe.poll() is not None:
            break

    return ''.join(utf8_output)

如你所见,我没有使用印刷品。那是因为一个要求告诉我使用stream对象,它可以是流式传输到文件,也可以实时输出到jenkins控制台。

因此,如果我想将外部输出打印到jenkins控制台,我想在我的工作中做这样的事情:

from io import TextIOBase
my_output_stream = TextIOBase()
func1(output_stream=my_output_stream)

func1是一个函数,它通过execute_cmd方法调用外部命令。 根据我的理解,这应该将外部命令的输出写入my_output_stream

现在我的问题是,如何实时输出写入该流的数据?我不需要任何异步执行吗?因为我不能在调用func1之后添加一个读取流的行的循环,因为这将在函数执行完成后执行,但不是实时的。

很抱歉对我的问题有一些奇怪的描述,如果还不清楚,请发表评论,我会更新我的问题,并做进一步的解释。

0 个答案:

没有答案