Python Tips: 標準出力の出力先がターミナルかそれ以外かによって処理を切り替えたい

Python で標準出力の出力先がターミナルの場合とそうでない場合とで処理を切り替える方法をご紹介します。

「標準出力の出力先がターミナルの場合とそうでない場合」というのは、具体的には次のようなイメージです。

標準出力の出力先がターミナルの場合:

$ # 出力先がターミナル
$ python sample.py

標準出力の出力先がターミナルでない場合:

$ # パイプで他のコマンドに渡されている
$ python sample.py | cat -
$ # ファイルに出力されている
$ python sample.py > result.txt

これができると、出力先がターミナルの場合とその他の場合とでフォーマットを自動で切り替えることが可能になります。例えば、「標準出力がターミナルの場合は視覚的に見やすく縦のラインを揃えて出力して、ファイルや別のコマンドの場合は余計な整形を行わず機械的に処理しやすい形で出力する」といったことができます。

で、早速結論ですが、次の記事の方法をそのまま標準出力にあてはめるだけで、とてもかんたんです。

要は、 sys.stdoutisatty() メソッドが、出力先がターミナルの場合は True を、そうでない場合は False を返してくれるので、これを利用します。

サンプルで確認してみましょう。

check_stdout.py:

# coding: utf-8

'''Python で出力がパイプされているかどうかをチェックする
'''

import sys

def main():
    if sys.stdout.isatty():
        print('もしや、出力先はターミナルですね。')
    else:
        print('出力先はターミナルではありませんね。')

if __name__ == '__main__':
    main()

このコードを check_stdout.py という名前で保存して実行してみます。

$ python check_stdout.py
もしや、出力先はターミナルですね。
$ python check_stdout.py | cat -
出力先はターミナルではありませんね。
$ python check_stdout.py > result.txt
$ cat result.txt
出力先はターミナルではありませんね。

出力先によって処理(この場合は出力内容)が切り替わっていることが無事確認できましたね。

以上です。シンプルで使いやすいですねー。