За допомогою модуля sh (pip install sh):
from sh import tail
for line in tail("-f", "/var/log/some_log_file.log", _iter=True):
print(line)
[оновлення]
Оскільки sh.tail з _iter
= True є генератором, ви можете:
import sh
tail = sh.tail("-f", "/var/log/some_log_file.log", _iter=True)
Тоді ви можете "getNewData" за допомогою:
new_data = tail.next()
Зверніть увагу, що якщо буфер хвоста порожній, він буде блокувати, поки не з’явиться більше даних (з вашого запитання незрозуміло, що ви хочете зробити в цьому випадку).
[оновлення]
Це працює, якщо замінити -f на -F, але в Python це буде блокування. Мені було б цікавіше мати функцію, яку я міг би викликати, щоб отримувати нові дані, коли я цього хочу, якщо це можливо. - Елі
Генератор контейнерів, розміщуючи зворотний виклик всередині циклу true і вловлюючи можливі винятки вводу-виводу, матиме майже такий же ефект, як -F.
def tail_F(some_file):
while True:
try:
for line in sh.tail("-f", some_file, _iter=True):
yield line
except sh.ErrorReturnCode_1:
yield None
Якщо файл стає недоступним, генератор поверне None. Однак він все одно блокується, поки не з'являться нові дані, якщо файл доступний. Для мене залишається незрозумілим, що ви хочете зробити у цій справі.
Підхід Реймонда Хеттінгера видається досить непоганим:
def tail_F(some_file):
first_call = True
while True:
try:
with open(some_file) as input:
if first_call:
input.seek(0, 2)
first_call = False
latest_data = input.read()
while True:
if '\n' not in latest_data:
latest_data += input.read()
if '\n' not in latest_data:
yield ''
if not os.path.isfile(some_file):
break
continue
latest_lines = latest_data.split('\n')
if latest_data[-1] != '\n':
latest_data = latest_lines[-1]
else:
latest_data = input.read()
for line in latest_lines[:-1]:
yield line + '\n'
except IOError:
yield ''
Цей генератор поверне '', якщо файл стане недоступним або якщо немає нових даних.
[оновлення]
Відповідь останньої останньої обводиться до верхньої частини файлу, здається, коли у нього закінчуються дані. - Елі
Я думаю, що другий буде виводити останні десять рядків, коли закінчується хвіст, що -f
відбувається, коли виникає помилка вводу-виводу. tail --follow --retry
Поведінка не далеко від цього в більшості випадків я можу думати в Unix-подібних середовищах.
Можливо, якщо ви оновите своє запитання, щоб пояснити, яка ваша справжня мета (причина, по якій ви хочете імітувати хвіст - спробу), ви отримаєте кращу відповідь.
Остання відповідь насправді не відповідає хвосту, а лише читає те, що доступно під час виконання. - Елі
Звичайно, за замовчуванням хвіст відображатиме останні 10 рядків ... Ви можете розташувати вказівник на файл у кінці файлу, використовуючи file.seek, я залишу належну реалізацію як вправу для читача.
IMHO підхід file.read () набагато витонченіший, ніж рішення на основі підпроцесу.
subprocess.call(["tail", "-F", filename])