我被要求在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
之后添加一个读取流的行的循环,因为这将在函数执行完成后执行,但不是实时的。
很抱歉对我的问题有一些奇怪的描述,如果还不清楚,请发表评论,我会更新我的问题,并做进一步的解释。