Explique el ejemplo de canalización desde el módulo de subproceso de Python.

Sección 17.1.4.2: Reemplazar la tubería de shell del módulo de subproceso python dice que se reemplace

output=`dmesg | grep hda` 

con

 p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. output = p2.communicate()[0] 

El comentario a la tercera línea explica por qué se llama a la función de cierre, pero no por qué tiene sentido. Para mi no lo es. ¿No se cerrará p1.stdout antes de llamar al método de comunicación para evitar que se envíe cualquier salida a través de la tubería? (Obviamente no lo hará, he intentado ejecutar el código y funciona bien). ¿Por qué es necesario llamar a close para que p1 reciba SIGPIPE? ¿Qué tipo de cierre es el que no cierra? ¿Qué, exactamente, se está cerrando?

Por favor considere esto como una pregunta académica, no estoy tratando de lograr nada, excepto entender mejor estas cosas.

Está cerrando p1.stdout en el proceso padre , por lo que deja dmesg como el único proceso con ese descriptor de archivo abierto. Si no hiciste esto, incluso cuando dmesg cerró su salida estándar, todavía lo tendrías abierto y no se generaría un SIGPIPE . (El sistema operativo básicamente mantiene un recuento de referencia y genera SIGPIPE cuando llega a cero. Si no cierra el archivo, evita que llegue a cero).