Stdout

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:37, 11 января 2019.

Stdout — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в stdout, что приводит к их появлению в консоли. Данные можно перенаправить в файл, присоединяя их к его содержимому, для этого служит команда >>. [Источник 1]

В Unix- подобных операционных системах , таких как Linux , macOS X и BSD , stdout определяется стандартом POSIX. Его номер дескриптора файла по умолчанию - 1 . В терминале стандартный вывод по умолчанию соответствует экрану пользователя.

POSIX-функция обработки ошибок perror используется в языках программирования Си и С++ для вывода сообщения об ошибке на основе номера последней ошибки, хранящейся в errno.

Stdout в командной строке

В bash последовательные команды могут быть подключены по каналам , представленным в командной строке вертикальной полосой (« | »). Команды в конвейере обрабатываются слева направо, со стандартным выходом ( stdout ) каждой команды, соединяющей стандартный вход ( stdin ) следующего. [Источник 2]

Например, в этом конвейере из двух команд:

 Фортуна | Cowsay

Программа фортуна , которая обычно печатает случайную цитату на экране пользователя, вместо этого соединяет свой вывод (stdout) со входом (stdin ) команды справа:

Рисунок 1 - Программа фортуна

Стандартные дескрипторы файлов

Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

0, STDIN — стандартный поток ввода.

1, STDOUT— стандартный поток вывода.

2, STDERR— стандартный поток ошибок. [Источник 3]

Эти три специальных дескриптора обрабатывают ввод и вывод данных в сценарии.

Перенаправление

Перед выполнением команды его ввод и вывод могут быть перенаправлены с использованием специальной нотации, интерпретируемой оболочкой. Перенаправление также может использоваться для открытия и закрытия файлов для текущей среды выполнения оболочки. Следующие операторы перенаправления могут предшествовать или появляться в любой точке простой команды или могут следовать за командой. Перенаправления обрабатываются в том порядке, в котором они появляются, слева направо.

Каждому перенаправлению, которому может предшествовать номер дескриптора файла, может предшествовать слово формы { varname } . В этом случае для каждого оператора перенаправления, кроме > & - и <& - , оболочка будет выделять файловый дескриптор более 10 и назначить ему имя varname . Если > & - или <& - предшествует { varname } , значение varname определяет дескриптор файла для закрытия.

В следующих описаниях, если номер дескриптора файла опущен, а первым символом оператора перенаправления является < , перенаправление относится к стандартному вводу (дескриптор файла 0). Если первым символом оператора перенаправления является > , перенаправление относится к стандартным выводам (дескриптор файла 1).

Слово, следующее за оператором перенаправления, в следующих описаниях, если не указано иначе, подвергается расширению скобки, расширению тильды, расширению параметров, замене команд, арифметическому расширению, сокращению цитат, расширению пути и разбиению слов. Если он расширяется до более чем одного слова, bash сообщает об ошибке. [Источник 4]

Перенаправление вывода

Перенаправление вывода вызывает файл, имя которого является результатом расширения слова, которое нужно открыть для записи в дескрипторе файла n , или стандартный вывод (дескриптор файла 1), если n не указано. Если файл не существует, он создается; если он существует, он усекается до нулевого размера.

Добавление перенаправленного вывода

Перенаправление вывода таким образом вызывает файл, имя которого является результатом расширения слова, которое нужно открыть для добавления в дескриптор файла n , или стандартный вывод (дескриптор файла 1), если n не указано. Если файл не существует, он создается.

Захват stdout

Во время выполнения теста любой вывод отправляется stdout и stderr записывается. Если тест или метод установки не будут выполнены, то соответствующий результат будет показан вместе с трассировкой отказа. (это поведение можно настроить с помощью параметра --show-capture командной строки).

Кроме того, stdin устанавливается «нулевой» объект, который будет терпеть неудачу при попытках прочитать из него, потому что редко требуется ждать интерактивного ввода при запуске автоматических тестов.

По умолчанию захват выполняется путем перехвата записи в низкоуровневые файловые дескрипторы. Это позволяет записывать выходные данные из простых операторов печати, а также выводить из подпроцесса, запускаемого тестом.

Настройка методов захвата или отключение захвата

Существует два способа pytest выполнения захвата:

файловый дескриптор (FD) (по умолчанию): все записи, поступающие в дескрипторы файлов 1 и 2 операционной системы, будут записаны. sysзахват уровня: записывается только в файлы Python sys.stdout и sys.stderrбудет зафиксирован. Выполняется запись записей в filedescriptors. Вы можете влиять на механизмы захвата вывода из командной строки:

  pytest  - s             # отключить все захват 
  pytest  - capture = sys  # заменить sys.stdout / stderr с файлами in-mem 
  pytest  - capture = fd   # также указать filedescriptors 1 и 2 в файл temp##!i##


Использование операторов печати для отладки

Одним из основных преимуществ захвата вывода по умолчанию является то, что вы можете использовать операторы печати для отладки: [Источник 5]

 # content of test_module.py 
   def  setup_function ( function ): 
        print  ( "установка % s "  %  function ) 
   def  test_func1 (): 
        assert  True 
   def  test_func2 (): 
        assert  False##!i##

и запуск этого модуля покажет вам точно результат функции сбоя и скроет другую:

 $ pytest 
  ======================= = ========== 
  платформа linux - Python 3.xy, pytest-3.xy, py-1.xy, pluggy-0.xy 
  rootdir: $ REGENDOC_TMPDIR, inifile: 
  собрано 2 элемента 
  test_module.py. F [100%] 
  ================================ НЕИСПРАВНОСТИ =========== ============================== 
  ________________________________ test_func2 ________________________________ 
  def test_func2 (): 
  > assert False 
  E assert False 
  test_module.py:9: AssertionError 
  ------- ------------------- Записанная настройка stdout --------------------------- 
  настройка up <function test_func2 at 0xdeadbeef>
  ==================== 1 не удалось, 1 прошел через 0,12 секунды ====================
##!i##

Источники

  1. Bash-скрипты, часть 4: ввод и вывод // Хабр [2006—2019]. Дата обновления: 17.04.2017. URL:https://habr.com/company/ruvds/blog/326594/ (дата обращения: 19.11.2018).
  2. Stdout // Computer Hope [2019—2019].URL: https://www.computerhope.com/jargon/s/stdout.htm (дата обращения: 11.01.2019).
  3. Bash-скрипты, часть 4: ввод и вывод // Хабр. [2006—2019].URL: https://habr.com/company/ruvds/blog/326594/ (дата обращения: 19.11.2018).
  4. Redirection // Computer Hope . [2018—2019].URL:https://www.computerhope.com/unix/ubash.htm#redirection (дата обращения: 22.11.2018).
  5. Класс StdOut. [2018—2018].URL: https://algs4.cs.princeton.edu/code/javadoc/edu/princeton/cs/algs4/StdOut.html (дата обращения: 19.11.2018).