Подтвердить что ты не робот

Почему мой Python3 script перекрывает вывод своего вывода в головку или хвост (модуль sys)?

У меня есть Python3 script, который записывает свой вывод в stdout, но он жалуется, когда я обрабатываю этот вывод в голову или хвост. Обратите внимание, что в примере ниже показано, что это работает, поскольку head возвращает запрошенные первые две строки вывода.

> ./script.py '../Testdata/*indels.ss' -m 5 | head -2                                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50
Traceback (most recent call last):
  File "./new.py", line 194, in <module>
    sys.stdout.write(lineout)
IOError: [Errno 32] Broken pipe
Exception IOError: IOError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored

Напротив, script не имеет проблем с его выходом, подключенным к awk, как показано ниже.

> ./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR < 3 {print $0}'                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50

Сообщите мне, нужен ли вам код из script, кроме того, что содержится в сообщении об ошибке. Я не уверен, что будет актуальным.

4b9b3361

Ответ 1

./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR >= 3 {exit} 1'

будет показывать то же поведение, что и head -2.

Вы можете настроить обработчик SIGPIPE на тот, который спокойно убивает вашу программу:

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)

Ответ 2

Я приведу из здесь:

Если последовательность команд появляется в конвейере, а одна из

команды чтения заканчиваются до завершения записи,

получает сигнал SIGPIPE.

Что делает head. Ваш script не закончил запись, но head уже выполнен, поэтому stdout закрыт, поэтому исключение.