2010-10-08 6 views
2

Disons que j'ai un programme python qui crache lignes de texte, tels que:moyen le plus facile de mettre en pause un programme python en ligne de commande?

while 1: 
    print "This is a line" 

Quelle est la meilleure façon d'un permettre d'appuyer sur une touche du clavier pour mettre en pause la boucle, puis de reprendre si pressé encore --- mais si rien n'est pressé il devrait juste continuer automatiquement? J'espère que je ne devrais pas entrer dans quelque chose comme des malédictions pour obtenir ceci!

+1

Dupe: http: //stackoverflow.com/questions/577467/pause-in-python ??? –

+0

Quel système d'exploitation utilisez-vous? – ktdrv

+1

@Preet Sangha: Je ne dirais pas que c'est un doublon. La question ici est comment pouvez-vous mettre le programme en pause lorsque * l'utilisateur * le veut et que vous faites allusion au fait de faire une pause du programme quand * ça * le veut. – ktdrv

Répondre

4

Vous pouvez essayer cette implémentation pour Linux /Mac (et éventuellement d'autres systèmes Unix) (attribution de code: found on ActiveState Code Recipes).

Sur Windows vous devriez vérifier 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 <> [] 

La mise en œuvre ce que vous cherchez deviendrait alors quelque chose comme ceci:

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 
2

La façon la plus simple pour me, en supposant que je travaillais dans bash, serait de frapper Ctrl-Z pour suspendre le travail, utilisez la commande 'fg' pour le restaurer quand j'étais prêt. Mais puisque je ne sais pas quelle plate-forme vous utilisez, je vais devoir utiliser la solution de ChristopheD comme meilleur point de départ.

Questions connexes