从python分页输出

nre*_*ren 23 python

我正在尝试实现类似的东西git log,如果日志有一定的长度,它只会分页输出.如果你不熟悉git,我基本上是想实现这个:

python some_script.py | less
Run Code Online (Sandbox Code Playgroud)

在python2.6/pydoc.py的分页实现的帮助下,我能够想出这个:

import os
text = '...some text...'
pipe = os.popen('less', 'w')
pipe.write(text)
pipe.close()
Run Code Online (Sandbox Code Playgroud)

这很好用,但os.popen()已被弃用.我考虑过写一个临时文件并用它的路径调用较少,但这似乎并不理想.子进程可以实现吗?还有其他想法吗?

编辑:

所以我已经让子进程工作了.我能够给它文本变量Popen.communicate(text),但由于我真的想重定向打印语句,我已经解决了这个问题:

  import os, sys, subprocess, tempfile

  page = True
  if page:
      path = tempfile.mkstemp()[1]
      tmp_file = open(path, 'a')
      sys.stdout = tmp_file
  print '...some text...'
  if page:
      tmp_file.flush()
      tmp_file.close()
      p = subprocess.Popen(['less', path], stdin=subprocess.PIPE)
      p.communicate()
      sys.stdout = sys.__stdout__     
Run Code Online (Sandbox Code Playgroud)

当然,我最终将它包装成函数.有没有人看到这个问题?

ral*_*hei 37

这个怎么样:

import pydoc
text = '... some text ... '
pydoc.pager(text)
Run Code Online (Sandbox Code Playgroud)

这(在我的opensuse linux框中)将文本发送到寻呼机(在我的情况下为'less'),并且与在Python解释器中调用"help(... python command ...)"的工作方式相同.

  • 6 年后,这种方法在 Python 3.7.2 中仍然有效;-) (8认同)
  • 虽然我怀疑将来无法使用此功能,但遗憾的是,它没有记录(https://docs.python.org/3.5/library/pydoc.html),因此原则上并未完全保证它将保持可用.考虑到它有多方便,我猜这是一个应该经常值得的风险.此外,[源代码](https://hg.python.org/cpython/file/3.5/Lib/pydoc.py#l1406)看起来无论如何都可以轻松复制. (4认同)