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