Miałem to samo pytanie. Na stronie pydoc module jest wbudowany pager. Włączyłem go w ten sposób (co uważam za hackowskie i niesatysfakcjonujące ... jestem jednak otwarty na lepsze pomysły).
Podoba mi się pomysł, że będzie on działał automatycznie, jeśli jest więcej niż x wyników i jest włączona obsługa stronicowania, którą można zaimplementować, ale nie można jej tutaj wykonać.
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")
Dzięki, ale mniejszy przerywnik uniemożliwi interakcję, co jest celem modułu cmd. Wdrożenie rozwiązania curses daleko wykracza poza pierwszą wersję roboczą, którą chcę zbudować za pomocą modułu cmd. Jednak twoje rozwiązanie print_and_wait jest dobrym początkiem (nie działało jak jest). – Gra