У меня есть код, который использует 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.
Оказывается, libc OSX не экспортирует ни один символ под названием 'stdout'. Вместо этого его stdio.h имеет стандартный вывод, определенный как:
#define stdout __stdoutp
Если я изменю свой код на c_void_p.in_dll(libc, '__stdoutp')
, мой код будет работать как положено, но, конечно, это только для OSX. В Windows, как выясняется, есть похожая проблема (по крайней мере, при использовании MSVC).
Я, вероятно, просто изменю свой код на использование 1
, но мой вопрос все еще стоит из любопытства, если есть кроссплатформенный способ получить указатель stdio
(а также stdin
и stderr
) без при условии , что он использует POSIX-совместимый дескриптор?