与python cmd模块分页

时间:2009-02-06 16:21:17

标签: python pagination cmd

我正在使用cmd模块对Python应用进行原型设计。

给用户的一些消息会很长,我想对它们进行分页。 将显示消息的前10行(或可配置数字)行,按空格键将显示下一页,直到消息结束。

我不想在这里重新发明一些东西,实现这个功能有一个简单的意思吗?

4 个答案:

答案 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.pyIPython文件中找到分页子程序(有关更简单的page,请参阅page_dumb或{{1}})。代码有点复杂,但如果您想要移植到包括Windows和各种终端仿真器在内的系统,这可能是不可避免的。