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上测试 .