Python: 自身の出力をPAGERに渡す

Pythonスクリプト自身の出力を、ページャーを咬ませて表示させてみました。

環境変数PAGERで使用するページャーを指定できます。

まずは本体

Python3.4環境で作成・確認しました。

使い方

main関数を2つの引数(arg1, arg2)で呼び出す次のようなプログラムの場合、

retval = main(arg1, arg2)

ページャーを使用するには次のようにします。

retval = with_pager(main, arg1, arg2)

ポイント

出力先がファイルやパイプなど画面以外の場合は、ページャーを咬ませたくないのでその判別を行います。
これはos.isatty()で行っています。

subprocess.Popen()に文字列ストリームを入力したい場合は、 universal_newlines=Trueパラメータが必須です。

with_pager() から呼び出される処理内で sys.exit() が呼び出されると標準出力が回復されないので、 atexit モジュールを使用してこれを回避しています。
ちなみに、出力がおかしくなった場合は、シェルから stty sane を実行すると回復できるかもしれません。(FreeBSD /DragonflyBSDで確認)

[おわり]