2011-08-02 14 views
7

ファイルディスクリプタが有効かどうかを確認するにはどうすればよいですか?可能であればfd=3に書きます。それ以外の場合は、stdoutに書きたいと思います。私は、os.writeの呼び出しをtry-except文で折り返すことができることを知っていますが、fd=3が書き込み可能かどうかを事前に知りたいと思います。ファイルディスクリプタが有効かどうかをチェック

答えて

6

os.fstatを使用して、ファイルディスクリプタが各書き込み前に有効かどうかを判断できますが、無効なファイルディスクリプタがOSErrorになるため、try/exceptでラップする必要があります。おそらくtry/exceptを使って独自のwrite関数を作成する方がよいでしょう。

def write(data, fd=3): 
    try: 
     os.write(fd, data) 
    except OSError: 
     sys.stdout.write(data) 
+0

と信じています。ありがとう、私は 'os.fstat'を使用します。 – cpburnz

2

方法(try内 - exceptブロック)開始時に一度fd=3os.writeしようと程度、及びその成功に基づいて、後続のすべての動作を変更?

この方法では、すべての通話をtry - exceptに折り返す必要はありません。もちろん、問題の途中でfd=3が有効でなくなると(たとえば、もう一方の端から閉じているパイプの場合)、これが解消されます。

+1

私は除いている/ 'os.fstat'を呼び出して試してみて、FDにジャンクを書くの副作用を避けるために、むしろos.write''よりも、モード・ビットをチェックし、それ以外はええ、試してみましたこの問題の完璧なイディオム。 "許しなどを求めるのが良い" –

+0

@Chris Farmiloe: 'os.fstat'は壊れたパイプを検出するでしょうか? – NPE

+0

ええ、 "閉鎖ファイルの操作"を提起します。 "ValueError"私は –

関連する問題