run - paginación con el módulo python cmd
run python script windows (4)
Estoy creando prototipos de una aplicación Python con el módulo cmd .
Algunos mensajes para el usuario serán bastante largos y me gustaría paginarlos. Aparecerán las primeras 10 líneas (o un número configurable) del mensaje, y presionando la barra espaciadora se mostrará la página siguiente, hasta el final del mensaje.
No quiero reinventar algo aquí, ¿hay una manera simple de implementar esta característica?
Lo más simple sería canalizar su script a través de "menos" o un comando similar en tiempo de ejecución.
Aquí hay un método simple que hace aproximadamente lo que quieres, sin embargo:
def print_and_wait(some_long_message):
lines = some_long_message.split(''/n'')
i=0
while i < len(lines):
print ''/n''.join(lines[i:i+10])
raw_input("press enter to read more...")
i += 10
También podrías considerar usar maldiciones.
Como dijo Yoni anteriormente, la forma correcta de hacerlo es proporcionar un método de impresión que páginas automáticamente dentro de su instancia de cmd en ejecución. El constructor de Cmd toma argumentos stdin y stdout. Tan simple, proporcione un objeto que funcione como stdout y admita su método de impresión de paginación.
class PagingStdOut(object):
def write(self, buffer, lines_before_pause=40):
# do magic paging here...
Las subrutinas de paginación se pueden encontrar en el archivo genutils.py de IPython (consulte la page
o page_dumb
para obtener una más simple). El código es un poco complicado, pero eso es probablemente inevitable si está tratando de ser portátil para sistemas que incluyen Windows y los diversos tipos de emuladores de terminal.
Tenía la misma pregunta. Hay un buscapersonas integrado en el módulo pydoc . Lo incorporé de esta manera (que me parece hackoso e insatisfactorio ... aunque estoy abierto a mejores ideas).
Me gusta la idea de que sería una página automática si hay más de x resultados y la paginación está activada, lo que es posible implementar, pero no se hace aquí.
import cmd
from pydoc import pager
from cStringIO import StringIO
import sys
PAGER = True
class Commander(cmd.Cmd):
prompt = "> "
def do_pager(self,line):
global PAGER
line = line + " 1"
tokens = line.lower().split()
if tokens[0] in ("on","true","t", "1"):
PAGER = True
print "# setting PAGER True"
elif tokens[0] in ("off","false","f","0"):
PAGER = False
print "# setting PAGER False"
else:
print "# can''t set pager: don''t know -> %s" % tokens[0]
def do_demo(self,line):
results = dict(a=1,b=2,c=3)
self.format_commandline_results(results)
def format_commandline_results(self,results):
if PAGER:
ofh = StringIO()
else:
ofh = sys.stdout
for (k,v) in sorted(results.items()):
print >> ofh, "%s -> %s" % (k,v)
if PAGER:
ofh.seek(0)
pager(ofh.read())
return None
def do_EOF(self,line):
print "",
return True
if __name__ == "__main__":
Commander().cmdloop("# try: /n> pager off /n> demo /n> pager on /n> demo /n/n")