views:

118

answers:

3

Let's say I have a python program that is spitting out lines of text, such as:

while 1:
  print "This is a line"

What's the easiest way to allow one to press a key on the keyboard to pause the loop, then to resume if pressed again---but if nothing is pressed it should just continue on automatically?

I'm hoping I don't have to go into something like curses to get this!

+3  A: 

You could try this implementation for Linux / Mac (and possible other Unices) (code attribution: found on ActiveState Code Recipes).

On Windows you should check out msvcrt.

import sys, termios, atexit
from select import select

# save the terminal settings
fd = sys.stdin.fileno()
new_term = termios.tcgetattr(fd)
old_term = termios.tcgetattr(fd)

# new terminal setting unbuffered
new_term[3] = (new_term[3] & ~termios.ICANON & ~termios.ECHO)

# switch to normal terminal
def set_normal_term():
    termios.tcsetattr(fd, termios.TCSAFLUSH, old_term)

# switch to unbuffered terminal
def set_curses_term():
    termios.tcsetattr(fd, termios.TCSAFLUSH, new_term)

def putch(ch):
    sys.stdout.write(ch)

def getch():
    return sys.stdin.read(1)

def getche():
    ch = getch()
    putch(ch)
    return ch

def kbhit():
    dr,dw,de = select([sys.stdin], [], [], 0)
    return dr <> []

Implementing what you're looking for would then become something like this:

atexit.register(set_normal_term)
set_curses_term()

while True:
    print "myline"
    if kbhit():
        print "paused..."
        ch = getch()
        while True
            if kbhit():
                print "unpaused..."
                ch = getch()
                break
ChristopheD
+2  A: 

The easiest way for me, assuming I was working in bash, would be to hit Control-Z to suspend the job, then use the 'fg' command to restore it when I was ready. But since I don't know what platform you're using, I'll have to go with using ChristopheD's solution as your best starting point.

Brian Wisti
A: 

Control-d stops a non-background process on bash or bourne shell. Both Linux and Max OS X default to bash for its primary shell program, so you can just assume the shell takes care of emitting the keyboard interruption signal.

OTZ