LINUX.ORG.RU

[ Python ] Как читать fifo?


0

1

Есть некий fifo-файл через который непрерывным потоком идут данные, как их считывать средствами питона?

Т.е. данные бесконечны, загрузить их не выйдет и надо читать именно последние строки. Есть вобще что-то наподобии tail -f?

★★

Ответ на: комментарий от anonymous

А что open?Open - открытие файла, как мне из него последние строки читать?Всякие read, readline и т.п. читают с начала.

nitz ★★
() автор топика
Ответ на: комментарий от iSlava

а еще это можно завернуть в fifo очередь

import Queue

q = Queue.Queue()

for i in range(5):
    q.put(i)

while not q.empty():
    print q.get()

iSlava
()

а как это у бесконечного потока данных может быть последняя строка?;-)

если нравится tail, os.popen('tail ... '). Тока popen устарел вроде, там щас че та другое, забыл что;-(

AIv ★★★★★
()
Ответ на: комментарий от iSlava

threading.Lock, len(), seek(), read()?

В питоне можно вызывать seek для пайпа. O_o

Доо, Гвидо походу хорошенько упоролся, прежде чем создавать своего веселого зеленого змия.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

я разве писал про пайп? там было четыре наводящие на правильный путь функции, но до пайпов там далеко.

import time, os

filename = 'security_log'
file = open(filename,'r')

st_results = os.stat(filename)
st_size = st_results[6]
file.seek(st_size)

while 1:
    where = file.tell()
    line = file.readline()
    if not line:
        time.sleep(1)
        file.seek(where)
    else:
        print line

iSlava
()
Ответ на: комментарий от pathfinder

>В питоне можно вызывать seek для пайпа. O_o
в файловой системе это же просто

файл.

что такого удивительного делать ему seek?

iSlava
()
Ответ на: комментарий от iSlava

в файловой системе это же просто

Ничего, кроме сообщения об ошибке, не получишь. А так, можно, да.

А ещё можно дескриптор пайпа передать функциям вроде: connect, bind, listen. ОС нормально отработает в таком случае.

//А вообще спор бессмысленный. Надо заканчивать. Пускай ТС делает lseek для пайпа, если в этом есть какой-то сакральный смысл. Я не против. :)

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Автор просто несет какую-то чушь про бесконечный fifo. Если кто-то записал какие-то данные в fifo, то кто-нибудь должен эти данные обязательно считать. Но на самом деле автор конечно может сделать cat fifo >/dev/null перед запуском программы, видимо это он и хочет.

ei-grad ★★★★★
()

я последний раз fopen в Си под DOSом использовал, так что лошара в вопросе, но... есть ли возможность (параллельно с записью в файл) слать строки в stdin и ловить это (питоном) ?

q11q11 ★★★★★
()
Ответ на: комментарий от q11q11

Если что-то можно сделать на posix сях, в отношении файлов, то это один-в-один (почти) реализовывается на питоне.

anonymous
()
Ответ на: комментарий от pathfinder

open()

O_NONBLOCK

When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is set:

An open() for reading only will return without delay. An open() for writing only will return an error if no process currently has the file open for reading.

If O_NONBLOCK is clear:

An open() for reading only will block the calling thread until a thread opens the file for writing. An open() for writing only will block the calling thread until a thread opens the file for reading.

примеры

#блокирующий способ
f = open('./myfifo', 'r')               
f = os.open('./myfifo', os.O_RDONLY)  
#неблокирующий
f = open('./myfifo', 'w+')                            
f = os.open('./myfifo', os.O_RDWR)                   
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   

Ничего, кроме сообщения об ошибке, не получишь.


это только в случае использования fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK) - там будет эксепшен

//я тоже обычно против таких споров, но интересно же

iSlava
()

>Ничего, кроме сообщения об ошибке, не получишь.

Да, никакие seek-и не работают; IOError: [Errno 29] Illegal seek

=================================================================

Но впрочем это не важно, походу в файле одна строка, просто очень длинная).В итоге первый ответ анонимуса оказался наиболее близок - просто f = open(«файл») и for s in f: «делать что надо»

Вобщем всем спасибо, в этом конкретном случая я разобрался - но в целом я нифига не понял.( Наверно надо будет глянуть на исходники tail-а на досуге, как он читает с конца.

nitz ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.