我有一些代码使用 ctypes 来尝试确定所指向的文件sys.stdout
是否实际上是 stdout
. 我知道在任何符合 POSIX 的系统上,甚至在 Windows 上,都应该安全地假设这是真的 if 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-only。事实证明,Windows 也有类似的问题(至少在使用 MSVC 的情况下)。
我可能只是将我的代码更改为 use 1
,但出于好奇,我的问题仍然存在,如果有一种跨平台的方式来获取stdio
指针(同样是stdin
and stderr
)而不假设它使用的是符合 POSIX 的描述符?