Я пытаюсь реализовать нечто похожее на 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() устарел. Я рассмотрел запись в временном файле и меньше ссылаюсь на его путь, но это не кажется идеальным. Возможно ли это с подпроцессом? Любые другие идеи?
EDIT:
Итак, я получил подпроцесс. Мне удалось передать текстовую переменную с помощью 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__
Конечно, я бы включил его в функции. Кто-нибудь видит проблему с этим?