Line-by-line processing when stdin is not a tty

Peter Otten __peter__ at web.de
Wed Aug 11 10:49:03 EDT 2010


Grant Edwards wrote:

> On 2010-08-11, Tim Harig <usernet at ilthio.net> wrote:
>> On 2010-08-11, RG <rNOSPAMon at flownet.com> wrote:
>>> When stdin is not a tty, Python seems to buffer all the input through
>>> EOF before processing any of it:
>>>
>>> [ron at mickey:~]$ cat | python
>>> print 123
>>> print 456 <hit ctrl-D here>
>>> 123
>>> 456
>>>
>>> Is there a way to get Python to process input line-by-line the way it
>>> does when stdin is a TTY even when stdin is not a TTY?
>>
>> It would be much better to know the overall purpose of what you are
>> trying
>> to achieve.  There are may be better ways (ie, sockets) depending what
>> you
>> are trying to do.  Knowing your target platform would also be helpful.
>>
>> For the python interpeter itself, you can can get interactive behavior by
>> invoking it with the -i option.
> 
> If you're talking about unbuffered stdin/stdout, the option is -u.
> 
> I don't really see how the -i option is relevent -- it causes the
> interpreter to go into interactive mode after running the script.

I'd say the following looks like what the OP was asking for:

$ cat | python -i -c'import sys; sys.ps1=""'
print sys.stdin.isatty()
False
print 1
1
print 2
2

(Whether it's useful is yet another question)

>> If you want to handle stdin a single line at a time from inside of your
>> program, you can access it using sys.stdin.readline().
> 
> That doesn't have any effect on stdin buffering.
 
"for line in stream"-style file iteration uses an internal buffer that is 
not affected by the -u option; stream.readline() doesnt use this 
optimization.

Peter





More information about the Python-list mailing list