Reading from stdin
Luis Zarrabeitia
kyrie at uh.cu
Tue Oct 7 20:35:04 EDT 2008
On Tuesday 07 October 2008 05:12:28 pm Lawrence D'Oliveiro wrote:
> In message <mailman.2148.1223409399.3487.python-list at python.org>, Luis
>
> Zarrabeitia wrote:
> > I have a problem with this piece of code:
> >
> > ====
> > import sys
> > for line in sys.stdin:
> > print "You said!", line
> > ====
> >
> > Namely, it seems that the stdin buffers the input, so there is no reply
> > until a huge amount of text has bin written. The iterator returned by
> > xreadlines has the same behavior.
> >
> > The stdin.readline() function doesn't share that behaviour (it returns as
> > soon as I hit 'enter').
>
> Perhaps line-buffering simply doesn't apply when you use a file object as
> an iterator.
You cut out the question you replied to, but left the rest. I got a bit
confused until I remembered that *I* wrote the email :D.
Anyway, I changed the program to:
===
buff = file("test")
for line in buff:
print "you said", line
===
where 'test' is a named pipe (mkfifo test) to see if the line-buffering also
happened with a file object, and it does. As with stdin, nothing gets printed
until the end of the file or it receives a huge amount of lines, but
using '.readline()' works immediately. So it seems that the buffering
behavior happens by default on stdin and file. It makes sense, as type(stdin)
is 'file'. I can't test it now, but I think the sockets also do input
buffering. I guess one doesn't notice it on the general case because disk
reading happens too fast to see the delay.
That raises a related question: is there any use-case where is better to lock
the input until a lot of data is received, even when the requested data is
already available? Output buffering is understandable and desired (how do I
turn it off, by the way?), and even that one wont lock unless requested to
lock (flush), but I can't find examples where input buffering helps.
(full example with pipes)
$ mkfifo test
$ cat > test
[write data here]
on another console, just execute the script.
Oh, I forgot:
Linux 2.6.24, python 2.5.2, Debian's standard build. I don't have windows at
hand to try it.
--
Luis Zarrabeitia (aka Kyrie)
Fac. de Matemática y Computación, UH.
http://profesores.matcom.uh.cu/~kyrie
More information about the Python-list
mailing list