[Python-Dev] py3k buffered I/O - flush() required between read/write?
Genstein
pythondev at genstein.net
Thu May 12 04:35:16 CEST 2011
Hi all,
Sincere apologies for posting a question without lurking for a while
first. I'm not sure whether I'm being dumb (which is very plausible) or
whether this is a potential bug. I asked on comp.lang.python but
responses were equivocal, so I'm following the README.txt advice and
asking here. If I'm out of line, do feel free to slap me down viciously,
remove me from the list, or whatever seems most appropriate.
Under py3k, is it necessary to flush() a file between buffered
read/write calls in order to see consistent results? I have a case under
Python 3.2 (r32:88445) where I see different results depending on
whether buffering is active, on Gentoo Linux and Windows Vista. Perusing
the docs and PEPs I couldn't seem to find an answer; I did find
bufferedio.c's comment: "BufferedReader, BufferedWriter and
BufferedRandom...share a single buffer...this enables interleaved reads
and writes without flushing" which is suggestive but I may be taking it
out of context.
The following is the smallest code I can conjure which demonstrates the
issue I'm seeing:
[code]
START = 0
MID = 1
LENGTH = 4
def test(buffering):
f = open("test.bin", "w+b", buffering = buffering)
for i in range(LENGTH):
f.write(b'\x00')
f.seek(MID)
f.read(1)
f.write(b'\x00')
f.seek(MID)
f.write(b'\x01')
f.seek(START)
f.seek(MID)
print(f.read(1))
f.close()
print("Buffered result: ")
test(-1)
print("Unbuffered result:")
test(0)
[end code]
Output on both Gentoo and Vista is:
Buffered result:
b'\x00'
Unbuffered result:
b'\x01'
I expected the results to be the same, but they aren't. The issue is
reproducible with larger files provided that the constants are increased
~proportionally (START 0, MID 500, LENGTH 1000 for example). Transposing
the buffered/unbuffered tests and/or using different buffer sizes for
the buffered test seem have no effect.
Apologies once more if I'm wasting your time.
All the best,
-eg.
PS. By way of entirely belated introduction, I'm a UK software developer
with a background mostly in C#, C++ and Lua in both "real software" and
commercial games. In my spare time I mostly write code (curiously I
don't know many developers who do; I suspect I just know the wrong
people.) I perpetrated the Trizbort mapper for interactive fiction which
doubtless nobody will have heard of, and with good reason. I'm toying
with Python as a genuinely portable alternative to C# for my own
projects, and so far loving it.
More information about the Python-Dev
mailing list