我有一些使用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时如此)。我可能只会将我的代码更改为使用
1
,但出于好奇,我的问题仍然存在,是否有一种跨平台的方法可以获取stdio
指针(以及类似地获取stdin
和stderr
),而不需要假设它正在使用符合POSIX标准的描述符?
fileno(stdout)
,尽管也有一个预定义的宏来表示该值,名为STDOUT_FILENO
。 - Kerrek SBsys.stdout
被替换了,原始的stdout
仍然存在于sys.__stdout__
中(除非您的代码也更改了它)。请查看sys.__stdout__.fileno()
=>1
。 - Dan D.