24

シェルから実行することを目的とした単純なPythonスクリプトで、sys.stdinが実際のファイルからリダイレクトされたのか、別のプロセスからパイプされたのかを確実に判断できますか?

stdinがデータファイルからのものか、パイプを介した別のプロセスからのストリーミングかによって、実行時の動作を変更したいと思います。

予想どおり、isatty()どちらの場合もFalseを返します。簡単なisatty()テストは次のとおりです。

# test.py
import os
import sys
print sys.stdin.isatty()
print os.isatty(sys.stdin.fileno())

テスト:

python test.py < file.txt

生成:

False
False

と:

ls -al | python test.py

生成:

False
False

これを行うためのpythonicメソッドはありますか?

Unix / Linux固有でも問題ありませんが、これを移植可能な方法で実行できるかどうかを知っておくと便利です。

編集:コメント投稿者への返信に注意してください:なぜ私は気にするのですか?ええと、私の場合、別のプロセスからパイプされたときに不規則な間隔で入ってくるタイムスタンプ付きのデータを処理したいと思います。事前に録音したデータをファイルから再生する場合、固定または可変の遅延を使用して再生したいと思います。

よりクリーンな方法を使用することがおそらく有利であることに同意します(そして、再生ストリームに遅延を挿入するための中間スクリプトを含むいくつかの方法を考えることができます)が、私は最終的に興味があります。

4

1 に答える 1

28

あなたはstatマクロを探しています:

import os, stat

mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode):
     print "stdin is piped"
elif stat.S_ISREG(mode):
     print "stdin is redirected"
else:
     print "stdin is terminal"
于 2012-11-18T18:55:08.987 に答える