Как я могу узнать, был ли затронут sys.stdout в этом случае?
Вы не можете , потому что stdout мог быть перенаправлен или конвейер (командой, используемой в вашей оболочке для запуска скрипта Python).Например, ваш пользователь мог перенаправить стандартный вывод на /dev/null
(см. null (4) ), выполнив, например, ваш script.py
как script.py > /dev/null
, а затем ваш вопрос:даже не имеет никакого смысла.И ваш stdout
может быть даже сокетом, fifo, устройством и т. Д. Кроме того, some_code
может быть изменено *1022* (например, закрыть его, перенаправить с помощьюos.dup2
, переопределите сам объект stdout
Python и т. Д. ...)
Кроме того, ваша программа может даже не запускаться в терминале (например, crontab(5) задание или запуск вашей программы с at
или ssh
).См. Также t he tty demysified page.
stdout стандартный поток (обычно) устанавливается процессом вызова (обычно, но не всегда, некоторой оболочкой)который имеет fork (2) -ed и execve (2) -ed ваш скрипт.
И это не специфично для Linux, это Unixфилософия .Возможно, вы захотите прочитать какую-нибудь книгу по программированию для Unix или Linux (например, ALP ).
Вы можете обнаружить случай, когда ваш stdout является терминалом, используя ** isatty одна тысяча пятьдесят-четыре (3) * * +1055.Но это, безусловно, не охватывает все возможные варианты использования.
Linux имеет /proc/
(подробнее см. proc (5) ), и стандартный вывод также /dev/stdout
aka /proc/self/fd/1
на котором вы можете сделать stat (2) (и, конечно, вы можете напрямую сделать fstat
на STDOUT_FILENO
, что равно 1).Но даже это не охватит все возможные варианты использования.
Задумывались ли вы о случае, когда ваша программа контролирует себя (например, pythonp pythonp
...)?
Я не являюсьОбязательно поймите ваши настоящие цели, но они прозвучат в моей голове о теореме Райса , и ваша проблема может быть неразрешимой.