我正在使用cmd模块对Python应用进行原型设计。
给用户的一些消息会很长,我想对它们进行分页。 将显示消息的前10行(或可配置数字)行,按空格键将显示下一页,直到消息结束。
我不想在这里重新发明一些东西,实现这个功能有一个简单的意思吗?
答案 0 :(得分:4)
简单的事情就是在运行时通过“less”或类似的命令来管道你的脚本。
这是一个简单的方法,它大致可以满足您的需求:
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
你也可以考虑使用诅咒。
答案 1 :(得分:3)
正如Yoni所说,正确的方法是提供一种在运行的cmd实例中自动分页的打印方法。 Cmd的构造函数接受stdin和stdout参数。如此简单,提供一个像stdout一样工作的对象,并支持你的分页打印方法。
class PagingStdOut(object):
def write(self, buffer, lines_before_pause=40):
# do magic paging here...
答案 2 :(得分:1)
我有同样的问题。 pydoc module内置了一个寻呼机。我把它合并(我发现它是hackish和不满意的......虽然我对更好的想法持开放态度。)
我喜欢这样的想法:如果有超过 x 的结果并且分页处于打开状态,它将自动进行,这可以实现,但这里没有完成。
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")
答案 3 :(得分:0)
可以在genutils.py的IPython文件中找到分页子程序(有关更简单的page
,请参阅page_dumb
或{{1}})。代码有点复杂,但如果您想要移植到包括Windows和各种终端仿真器在内的系统,这可能是不可避免的。