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