Ich hatte die gleiche Frage. In der pydoc module ist ein Pager eingebaut. Ich habe es so eingebaut (was ich hackisch und unbefriedigend finde ... Ich bin offen für bessere Ideen).
Ich mag die Idee, dass es autopage würde, wenn es mehr als x Ergebnisse und Paging gibt, ist es möglich zu implementieren, aber nicht hier getan.
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")
Vielen Dank, aber die Durchleitung durch weniger würde die Interaktion verhindern, was das Ziel des cmd-Moduls ist. Die Implementierung einer curses-Lösung geht weit über den ersten Entwurf hinaus, den ich mit dem cmd-Modul erstellen möchte. Ihre print_and_wait-Lösung ist jedoch ein guter Anfang (funktionierte nicht so wie es ist). – Gra