ctypes を使用して、 が指すファイルsys.stdout
が実際に stdout
であるかどうかを判断しようとするコードがあります。POSIX準拠のシステム、さらにはWindowsでも、これが真であると仮定しても安全であることを知っているsys.stdout.fileno() == 1
ので、私の質問は一般的にこれを行う方法ではありません。
私のコード(私の質問とは関係のないものにすでにctypesを使用しています)では、不注意に次のようなものがありました:
libc = ctypes.CDLL(ctypes.util.find_library('c'))
real_stdout = libc.fileno(ctypes.c_void_p.in_dll(libc, 'stdout'))
if sys.stdout.fileno() == real_stdout:
...
これは Linux では問題なく動作するので、あまり考えていませんでした。1
ファイル記述子としてハードコーディングするよりも見栄えがよく、読みやすくなりました。しかし、数日後、私のコードが OSX で動作していないことがわかりました。
OSX の libc は「stdout」と呼ばれるシンボルをエクスポートしていないことがわかりました。代わりに、その stdio.h には stdout が次のように定義されています。
#define stdout __stdoutp
コードを自分のコードに変更すると、c_void_p.in_dll(libc, '__stdoutp')
期待どおりに動作しますが、もちろんそれは OSX のみです。Windows にも同様の問題があることが判明しました (少なくとも MSVC を使用している場合)。
私はおそらく自分のコードを use に変更するだけですが、POSIX準拠の記述子を使用していると仮定せずにポインター1
を取得するクロスプラットフォームの方法がある場合、私の質問は好奇心から立っています(同様に and ) ?stdio
stdin
stderr