Error de tubería rota en Python

En este artículo, analizaremos el error de canalización en python a partir de cómo se produjo un error en python junto con el tipo de solución que se debe seguir para rectificar el error en python. Entonces, entremos en este artículo para entender bien el concepto. 

Con el avance de las tecnologías emergentes en el sector de TI, el uso del lenguaje de programación está jugando un papel vital. Así se considera el lenguaje adecuado para las ejecuciones rápidas de las funciones. En tal caso, Python emerge como el lenguaje más importante para satisfacer las necesidades de ejecución del problema actual debido a su simplicidad y disponibilidad de varias bibliotecas. Pero junto con la ejecución, también surgen los errores durante la ejecución y se vuelve difícil para los programadores rectificar los errores para el procesamiento del problema.

La aparición del error de tubería rota

Un error de tubería rota es generalmente un error de entrada/salida, que se produce en el nivel del sistema Linux. El error se ha producido durante la lectura y escritura de los archivos y se produce principalmente durante las operaciones de los archivos. El mismo error que ocurría en el sistema Linux es EPIPE, pero cada función de librería que devuelve su código de error también genera una señal llamada SIGPIPE, esta señal se usa para terminar el programa si no es manejado o bloqueado. Por lo tanto, un programa nunca podrá ver el error EPIPE a menos que haya manejado o bloqueado SIGPIPE.

El intérprete de Python no es lo suficientemente capaz de ignorar SIGPIPE de forma predeterminada; en cambio, convierte esta señal en una excepción y genera un error que se conoce como IOError (error de ENTRADA/SALIDA), también conocido como ‘Error 32’ o Error de tubería rota.

Error de tubería rota en la terminal de Python

python <nombre de archivo>.py | cabeza

Este código de canalización escrito anteriormente creará un proceso que enviará los datos aguas arriba y un proceso que leerá los datos aguas abajo. Pero cuando el proceso descendente no pueda leer los datos ascendentes, generará una excepción enviando una señal SIGPIPE al proceso ascendente. Por lo tanto, el proceso ascendente en un problema de Python generará un error como IOError: se producirá un error de tubería rota.

Ejemplo:

Python3

for i in range(4000):
    print(i)

Cuando ejecutamos este archivo desde los comandos de Unix:

python3 main.py | head -n3000

Procedimiento para evitar el error de tubería rota

Enfoque 1: para evitar el error, necesitamos hacer que la terminal ejecute el código de manera eficiente sin captar la señal SIGPIPE, por lo que podemos agregar el siguiente código en la parte superior del programa python.

from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL) 

Python3

from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL)
  
for i in range(4000):
    print(i)

Producción:

0
1
20
1
2
3
4
5
6
7
8
9
3
4
5
6
7
8
9

Explicación:

El código anterior que se coloca en la parte superior del código python se usa para redirigir las señales SIGPIPE a la señal SIG_DFL predeterminada, que el sistema generalmente ignora para que el resto del código se pueda ejecutar sin problemas. Pero el Enfoque 11 no es efectivo porque en el manual de Python sobre la biblioteca de señales, se menciona que este tipo de manejo de señales debe evitarse y no debe practicarse en ninguna parte del código. Entonces, por esta razón, optaremos por el segundo enfoque.

Enfoque 2: Podemos manejar este tipo de error usando la funcionalidad del bloque try/catch que ya está aprobado por el manual de python y se recomienda seguir dicho procedimiento para manejar los errores.

import sys, errno  
try:  
   # INPUT/OUTPUT operation #
except IOError as e:  
   if e.errno == errno.EPIPE:  
       # Handling of the error  

Ejemplo:

Python3

import sys
import errno
  
try:
    for i in range(4000):
        print(i)
except IOError as e:
    if e.errno == errno.EPIPE:
      pass
       # Handling of the error

Producción:

0
1
2
3
4
5
6
7
8
9

Explicación:

En el código anterior, hemos utilizado la biblioteca integrada de python, que es el módulo Sys y Errno, y usamos el bloque try/catch para capturar la excepción SIGPIPE generada y manejarla antes de que detenga la ejecución del programa.

Publicación traducida automáticamente

Artículo escrito por manasmohapatra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *