Issue 1523853: 2.4.2 file.read caches EOF state (original) (raw)
It seems that python 2.4.2 file reading stuff (for l in f) and (f.read()) cache EOF state. For f.next documtation hints that there is internal buffer so I guess that this is somewhat acceptable there. But for f.read() there is no hint about internal buffering of the state.
This is somewhat unfortunate as tail -f like functionality is impossible to implement without doing lowlevel io (os.read) (as traddional unix has no select-like functionality on files).
Tested on solaris8. This is either library or documentation bug.
Code below
def iterline(f):
""" Own function because the internal seems to
buffer EOF
"""
b=[]
while 1:
data=os.read()
print data
,b
,f.tell(),
os.fstat(f.fileno()).st_size
if len(data) == 0:
time.sleep(1)
continue
idx=data.find('\n')
while idx > 0:
line=data[:idx]
if b:
yield ''.join(b) + line
b = []
else:
yield line
data=data[idx+1:]
idx=data.find('\n')
b.append(data)
raise StopIteration
Output '' [''] 1699424 1699424 (log lines appended here) '' [''] 1699424 1699647
In Linux, it seems to be the behaviour of the underlying C function 'fread'.
Do you think it's ok to add the following line in the read() documentation?
"""
As this function depends of the underlying C function :cfunc:fread
,
inheritates its behaviour in details like caching EOF and others.
"""
Assigning this to George, to reword that in nicer English and apply.
Regards,