我試圖實現類似於git log
的東西,如果日誌具有一定的長度,它只會分頁輸出。如果你不熟悉的git,我基本上是試圖實現這一點:來自python的分頁輸出
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()已棄用。我已經考慮寫一個臨時文件,並用它的路徑調用較少,但這看起來並不理想。這是可能的子進程?任何其他想法?
編輯:
所以我得到了子過程的工作。我能夠給它的文本變量與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)在閱讀文件之前不需要關閉()。 (3)不需要與尋呼機進程通信(一個簡單的'subprocess.call()'就足夠了)。 (4)更明確的是不要篡改全局像'sys.stdout';除非你真的需要這樣做(就像你想重定向你使用的所有子模塊的輸出一樣),明確地調用一個特殊的打印函數是一個好主意。 – EOL
這是類似的主題,很好,很精緻答案:http://stackoverflow.com/questions/37584717/how-to-write-python-script-with-man-page-like-output/ – user3019074