weird behavior in 'for line in sys.stdin'

Michael McFarland sidlonDoesntLikeSpam at yahoo.com
Tue Apr 29 19:25:48 EDT 2003


   Here's basic three ways of printing lines from standard input.  If
standard input is coming from a file or other program, all three behave
properly.  When run interactively from a bash prompt, however, there are
three different behaviors.  Method #3's behavior seems especially odd.  Is
there a bug here?

METHOD #1:
while 1:
  line = sys.stdin.readline()
  if not line:
    break
  line = line.rstrip()
  print "LINE: ", line

METHOD #2:
for line in sys.stdin.readlines():
   line = line.rstrip()
   print "LINE: ", line

METHOD #3:
for line in sys.stdin:    [or sys.stdin.xreadlines()]
   line = line.rstrip()
   print "LINE: ", line


---
Here's what happens when I type 'a', 'b', 'c', then 'ctrl-d' interactively
with each:

  METHOD #1:
a
LINE:  a
b
LINE:  b
c
LINE:  c
$>

  METHOD #2:
a
b
c
LINE:  a   <printed after crtl-D>
LINE:  b
LINE:  c
$>

  METHOD #3:
a
b
c
LINE:  a   <printed after crl-D>
LINE:  b
LINE:  c
<doesn't return to shell>
d
e
f
LINE:  d   <printed after a 2nd ctrl-D>
LINE:  e
LINE:  f
< and so on, until ctrl-D is hit twice in succession >
$>


   I can see why method #2 will obviously not print anything until
"readlines()" finishes.  But I would generally have expected method #3 with
its lazy evaluation to work like #1.  Can anyone shed some light on what's
really going on w/ 'for line in sys.stdin'?

  - Michael






More information about the Python-list mailing list