2018/01/30

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
出力先はターミナルではありませんね。

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

以上です。

シンプルでわかりやすいですねー。

0 件のコメント: