Skip to content Skip to sidebar Skip to footer

Python Stdin User Input Issue

Issue Conflict with STDIN when executing these two functions. What would cause the second function to not read STDIN correctly? If the first function is not executed, the second fu

Solution 1:

The problem arises from the behaviour of stdin flushing in unix

I'll answer by commmenting your code:

import sys, select

defstdin_read():

    print"[stdin read] You must answer Y/N and press ENTER"# sys.stdout.flush() # not needed# you are reading one byte here, but the user enters at least two bytes# (e.g 'y' + LF(enter key)) so the LF byte (and possibly additional bytes)# remain in the stdin buffer.
    response = sys.stdin.read(1) # (->LF REMAINS)print"You said '{}'".format(response)


defstdin_timeout():

    print"[stdin timeout] You must answer YES / NO in 10 seconds and press ENTER"#sys.stdout.flush() #  not needed# the behaviour of stdin flushing in unix is not defined (see # link above)
    sys.stdin.flush()
    # thus the LF still remains in the stdin buffer# the select call blocks until the file discriptor is 'ready' for# the corresponding i/o operation. DISCLAIMER: assumptions are# following.... By default python does a open call which uses# buffered reads, so even if you did a read(1) it will likely read# more data from stdin and the select call blocks until the next LF# arrives.
    i, o, e = select.select( [sys.stdin], [], [], 10 )

    if (i):
        # you are just reading the left over bytes from above (->LF REMAINS)print"You said '{}'".format(sys.stdin.readline().strip())
        # Proof: readline() again:print"You missed '{}'".format(sys.stdin.readline().strip())
        exit(0)
    else:
        print"You said nothing!"
        exit(1)


stdin_read()
stdin_timeout()

But maybe it would be better to use another approach Keyboard input with timeout in Python

Post a Comment for "Python Stdin User Input Issue"