I am trying to figure out how to create a little Python script that can take the following parameters:
The last one is the number of characters I can enter before the program stops accepting characters and starts processing the input. I've seen some people use Python's select.select method, but that doesn't account for the 3rd item. I'm leaning towards curses, although I don't know if it supports a timeout which is making me think of threads. Any insights would be great! This will run on Linux with Python 2.6.
Ok, I have achieved it :D.
#!/usr/bin/env python import sys from select import select def main(argv): timeout = 3 prompt = '> ' max_chars = 3 # set raw input mode if relevant # it is necessary to make stdin not wait for enter try: import tty, termios prev_flags = termios.tcgetattr(sys.stdin.fileno()) tty.setraw(sys.stdin.fileno()) except ImportError: prev_flags = None buf = '' sys.stderr.write(prompt) while True: # main loop rl, wl, xl = select([sys.stdin], , , timeout) if rl: # some input c = sys.stdin.read(1) # you will probably want to add some special key support # for example stop on enter: if c == '\n': break buf += c # auto-output is disabled as well, so you need to print it sys.stderr.write(c) # stop if N characters if len(buf) >= max_chars: break else: # timeout break # restore non-raw input if prev_flags is not None: termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, prev_flags) # and print newline sys.stderr.write('\n') # now buf contains your input # ... if __name__ == "__main__": main(sys.argv[1:])
It's fairly incomplete; I just put a few values to test it. A few words of explanation:
end_time), and then pass
end_time - current_timein seconds as timeout to