Problems with select() and stdin (solved)

Iñigo Serna inigoserna at terra.es
Tue Aug 20 19:10:36 CEST 2002


Hello again,

El dom, 18-08-2002 a las 17:34, jepler at unpythonic.net escribió:
> When you take input from a pipe, sys.stdin corresponds to the program on
> the left of the pipeline, not the terminal where the program is running (if
> any).

Aha!!!
 
> If you open the special device /dev/tty and assign the result to sys.stdin,
> raw_input reads from the terminal again, as in this example:
> 
> $ echo "standard input" | python -c '
> import sys;
> print sys.stdin.read(),;
> sys.stdin = open("/dev/tty");
> print raw_input("? ")'
> standard input
> ? _
> 
> This advice only applies to unix where /dev/tty is supported.

This runs ok with raw_input, but didn't work with my program, which uses
(n)curses. I needed to include an explicit close.

        fd = select([sys.stdin], [], [], 1)[0][0]
        stdin = ''.join(fd.readlines())
        # close stdin (pipe) and open terminal for reading
        os.close(0)
        sys.stdin = open(os.ttyname(1), 'r')

And now everything works ok.

Thanks Jeff,

Iñigo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 196 bytes
Desc: Esta parte del mensaje esta firmada digitalmente
URL: <http://mail.python.org/pipermail/python-list/attachments/20020820/091f3026/attachment.sig>


More information about the Python-list mailing list