You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.4 KiB
49 lines
1.4 KiB
import os
|
|
import time
|
|
import sys
|
|
import io
|
|
from threading import Thread
|
|
|
|
class BuildLogTail(Thread):
|
|
def __init__(self, fileName, logPrefix = ''):
|
|
self._fileName = fileName
|
|
self._logPrefix = logPrefix
|
|
self._stopReading = False
|
|
Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while not self._stopReading and not os.path.exists(self._fileName):
|
|
time.sleep(1)
|
|
|
|
# 修复中文显示错误和 print() 报错的 'gbk' codec can't encode character
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
|
|
|
|
with self.open_default_encoding(self._fileName, mode='r') as file:
|
|
while True:
|
|
where = file.tell()
|
|
line = file.readline()
|
|
if self._stopReading and not line:
|
|
break
|
|
if not line:
|
|
time.sleep(1)
|
|
file.seek(where)
|
|
else:
|
|
if sys.stdout.closed:
|
|
return
|
|
|
|
PrintLogASAP(self._logPrefix + line.rstrip())
|
|
|
|
def stop(self):
|
|
self._stopReading = True
|
|
# Wait for thread read the remaining log after process quit in 5 seconds
|
|
self.join(5)
|
|
|
|
@staticmethod
|
|
def open_default_encoding(file, mode):
|
|
return open(file, mode=mode, encoding='utf-8-sig')
|
|
|
|
def PrintLogASAP(str):
|
|
print(str)
|
|
|
|
sys.stdout.flush()
|
|
sys.stderr.flush()
|
|
|