【问题标题】:Paging output from print statement打印语句的分页输出
【发布时间】:2012-11-05 07:05:47
【问题描述】:

我实际上是在努力实现这一目标:

>>>print "SOME_VERY_LONG_TEXT" | more

当然,它在 Python 2.7(IDLE) 中不起作用。

另外,我尝试了pager 1.2page() 函数,但我不知道如何让它正常工作。

有什么想法吗?

[更新]

我找到了一个偷懒的方法,如下:

import pydoc
pydoc.pager("SOME_VERY_LONG_TEXT") 

【问题讨论】:

  • python foo.py | more 不起作用的任何原因?
  • @Aesthete:可能不会。 more是一个用于分页输出的linux命令行程序,类似于比较流行的less
  • IPython 默认分页输出一些输出(如使用object?? 语法检查的文档)。但是它不会分页表达式值(它们通过pprint 提供,但不通过分页器)。
  • 嗨,谢谢你的 pydoc.pager!

标签: python python-2.7


【解决方案1】:

您可以将其称为外部进程。 (不过,你必须 be carefulshell=True。)

import subprocess
longStr = 'lots of text here'
subprocess.call(['echo "'+longStr+'" | more'], shell=True)

【讨论】:

  • 如果你使用 less 而不是 more 使用 less -R 来获得彩色输出。 -R 选项将显示“原始”控制字符”。
【解决方案2】:

虽然有点晚了,但以下对我有用:

def less(data):
    process = Popen(["less"], stdin=PIPE)

    try:
        process.stdin.write(data)
        process.communicate()
    except IOError as e:
        pass

【讨论】:

    【解决方案3】:

    编写独立于终端和操作系统的东西可能是一项更大的任务。

    但是如果你能得到终端的高度,那么你可以使用这样的东西 假设您的输入是行分隔文本的生成器/列表,否则您可以在调用此函数之前调用 text.split('\n')

    def pagetext(text_lined, num_lines=25):
       for index,line in enumerate(text_lined):
           if index % num_lines == 0 and index:
               input=raw_input("Hit any key to continue press q to quit")
               if input.lower() == 'q':
                   break
           else:
               print line
    

    pypy 上还有一个pager 模块没用过,但作者说它应该包含在标准库中。

    【讨论】:

      最近更新 更多