Una pregunta simple, y otra no tanto

Chema Cortés ch3m4 en ch3m4.org
Mie Jun 4 16:22:55 CEST 2003


Marcos Sánchez Provencio escribió:
> Si no necesitas multihilo (threads) puedes intentarlo también con el 
> módulo select. Éste te permite hacer un bucle de atención a eventos, 
> donde rellenarías los huecos con proceso por tu cuenta.

Esta una buena solución que debería figurar en alguno de los 
repositorios de recetas de python (responde a una de las preguntas más 
frecuentes de python).

El código podría ser algo así:

#!/usr/bin/python

import os, sys
import tty
from select import select

class NotTTYException(Exception): pass

class TerminalFile:
         def __init__(self,infile):
                 if not infile.isatty():
                         raise NotTTYException()
		self.file=infile

                 #prepare for getch
                 self.save_attr=tty.tcgetattr(self.file)
                 newattr=self.save_attr[:]
                 newattr[3] &= ~tty.ECHO & ~tty.ICANON
                 tty.tcsetattr(self.file, tty.TCSANOW, newattr)

         def __del__(self):
		#restoring stdin
                 import tty  #required this import here
                 tty.tcsetattr(self.file, tty.TCSADRAIN, self.save_attr)

         def getch(self):
                 if select([self.file],[],[],0)[0]:
                         c=self.file.read(1)
                 else:
                         c=''
                 return c

if __name__=="__main__":
         s=TerminalFile(sys.stdin)
	print "Press q to quit..."
         i=0
         while s.getch()!="q":
                 sys.stdout.write("%08d\r"%i)
                 i+=1
         print "-- END --"


------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es