[Python-Dev] py3k buffered I/O - flush() required between read/write? (original) (raw)
Genstein pythondev at genstein.net
Thu May 12 04:35:16 CEST 2011
- Previous message: [Python-Dev] [Python-checkins] cpython (2.7): (Merge 3.1) Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional
- Next message: [Python-Dev] py3k buffered I/O - flush() required between read/write?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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.
- Previous message: [Python-Dev] [Python-checkins] cpython (2.7): (Merge 3.1) Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional
- Next message: [Python-Dev] py3k buffered I/O - flush() required between read/write?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]