java 调用python stdout_Python Popen:同时写入stdout和日志文件

Write to terminal byte by byte for interactive applications

此方法立即将其获取的任何字节写入stdout,这更接近地模拟了 tee 的行为,尤其是对于交互式应用程序 .

main.py

#!/usr/bin/env python3

import os

import subprocess

import sys

with subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc, \

open('logfile.txt', 'bw') as logfile:

while True:

byte = proc.stdout.read(1)

if byte:

sys.stdout.buffer.write(byte)

sys.stdout.flush()

logfile.write(byte)

# logfile.flush()

else:

break

exit_status = proc.returncode

sleep.py

#!/usr/bin/env python3

import sys

import time

for i in range(10):

print(i)

sys.stdout.flush()

time.sleep(1)

首先,我们可以进行非交互式健全性检查:

./main.py ./sleep.py

而且我们认为这是实时的stdout .

接下来,对于交互式测试,您可以运行:

./main.py bash

然后,您键入的字符会在您键入时立即显示在终端上,这对于交互式应用程序非常重要 . 运行时会发生这种情况:

bash | tee logfile.txt

此外,如果您希望输出立即显示在ouptut文件上,那么您还可以添加:

logfile.flush()

但 tee 不会这样做,我担心这会扼杀性能 . 您可以使用以下方法轻松测试:

tail -f logfile.txt

在Ubuntu 18.04,Python 3.6.7上测试 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值