Есть ли кроссплатформенный способ надежно найти дескриптор файла stdout с помощью ctypes?

У меня есть код, который использует ctypes, чтобы попытаться определить, есть ли файл, на который указывает sys.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-совместимый дескриптор?

5
задан bukzor 20 October 2014 в 18:46
поделиться