¿Por qué mi script Python3 se resiste a canalizar su salida a cabeza o cola (módulo sys)?

Tengo un script de Python3 que escribe su salida en la salida estándar, pero se queja cuando canalizo esa salida en cabeza o cola. Tenga en cuenta que en la salida de ejemplo que se muestra a continuación funciona, en ese head se están devolviendo las dos primeras líneas de salida tal como se solicitó.

 > ./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  sys.stdout.write(lineout) IOError: [Errno 32] Broken pipe Exception IOError: IOError(32, 'Broken pipe') in <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'> ignored 

En contraste, la secuencia de comandos no tiene problemas con la salida que se canaliza a awk como se muestra a continuación.

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

Avíseme si necesita algo de código del script más allá de lo que figura en el mensaje de error. No estoy seguro de lo que sería relevante.

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

Mostraría el mismo comportamiento que la head -2 .

Puede configurar el controlador SIGPIPE en uno que, en su lugar, destruya su progtwig:

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

Voy a citar desde aquí :

Si aparece una secuencia de comandos en una tubería, y uno de los

Los comandos de lectura terminan antes de que el escritor haya terminado, el

escritor recibe una señal SIGPIPE.

Eso es lo que hace la head . Su guión no ha terminado de escribirse, pero la head ya está terminada, por lo que la stdout está cerrada, de ahí la excepción.