【发布时间】:2011-07-18 04:34:50
【问题描述】:
我正在尝试实现类似于git log 的东西,它只会在日志具有一定长度时分页输出。如果你不熟悉 git,我实际上是在尝试实现这一点:
python some_script.py | less
在 python2.6/pydoc.py 中的分页实现的一些帮助下,我能够想出这个:
import os
text = '...some text...'
pipe = os.popen('less', 'w')
pipe.write(text)
pipe.close()
效果很好,但不推荐使用 os.popen() 。我考虑过写入临时文件并使用其路径调用 less,但这似乎并不理想。这可能与子流程有关吗?还有其他想法吗?
编辑:
所以我已经让子流程工作了。我可以用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__
当然,我最终会将它包装成函数。有没有人觉得这有问题?
【问题讨论】:
-
几点说明:(1)临时文件名是唯一的:打开方式应该是'w',而不是'a'(不可能追加到文件中)。 (2) 阅读前无需
close()文件。 (3)不需要和pager进程通信(一个简单的subprocess.call()就够了)。 (4) 更明确的是不篡改像sys.stdout这样的全局;除非你真的需要这样做(比如如果你想重定向你使用的所有子模块的输出),最好显式调用一个特殊的打印函数。 -
这是一个类似的主题,简洁明了 答案:stackoverflow.com/questions/37584717/…
标签: python