type try print error python io stdout ioerror

python - try - Error de entrada/salida IOError al imprimir



type error python (5)

Acabo de recibir este error porque el directorio donde estaba escribiendo los archivos se había quedado sin memoria. No estoy seguro si esto es aplicable a su situación.

He heredado un código que falla periódicamente (aleatoriamente) debido a un error de Entrada / Salida que se genera durante una llamada para imprimir. Estoy tratando de determinar la causa de la excepción que se genera (o al menos, entenderlo mejor) y cómo manejarlo correctamente.

Al ejecutar la siguiente línea de Python (en un intérprete 2.6.6, ejecutándose en CentOS 5.5):

print >> sys.stderr, ''Unable to do something: %s'' % command

Se levanta la excepción (se omite el rastreo):

IOError: [Errno 5] Input/output error

Para contexto, esto es generalmente lo que la función más grande está tratando de hacer en ese momento:

from subprocess import Popen, PIPE import sys def run_commands(commands): for command in commands: try: out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate() print >> sys.stdout, out if err: raise Exception(''ERROR -- an error occurred when executing this command: %s --- err: %s'' % (command, err)) except: print >> sys.stderr, ''Unable to do something: %s'' % command run_commands(["ls", "echo foo"])

La >> sintaxis no es particularmente familiar para mí, no es algo que use a menudo, y entiendo que es quizás la forma menos preferida de escribir a stderr. Sin embargo, no creo que las alternativas solucionen el problema subyacente.

De la documentación que he leído, IOError 5 a menudo se usa de forma incorrecta y se define de forma un tanto vaga, con diferentes sistemas operativos que la utilizan para cubrir diferentes problemas. Lo mejor que puedo ver en mi caso es que el proceso de python ya no está conectado al terminal / pty.

Lo mejor que puedo decir es que nada está desconectando el proceso de las secuencias stdout / stderr: el terminal todavía está abierto, por ejemplo, y todo parece estar bien. ¿Podría ser causado por el proceso hijo que termina de manera impura? ¿Qué otra cosa podría ser la causa de este problema o qué otros pasos podría introducir para depurarlo más?

En términos de manejo de la excepción, obviamente puedo atraparla, pero supongo que esto significa que no podré imprimir en stdout / stderr por el resto de la ejecución. ¿Puedo reincorporarme a estas secuencias de alguna manera, tal vez restableciendo sys.stdout a sys.__stdout__ etc.? En este caso, no poder escribir en stdout / stderr no se considera fatal, pero si es un indicio de que algo está empezando a salir mal, prefiero rescatar a tiempo.

Creo que, en última instancia, estoy un poco perdido en cuanto a dónde empezar a depurar esto ...


Creo que tiene que ver con el terminal al que se adjunta el proceso. Recibí este error cuando ejecuté un proceso de Python en segundo plano y cerré el terminal en el que lo inicié:

$ myprogram.py Ctrl-Z $ bg $ exit

El problema fue que comencé un proceso no demonizado en un servidor remoto y cerré la sesión (cerrando la sesión del terminal). Una solución fue iniciar una sesión de pantalla / tmux en el servidor remoto e iniciar el proceso dentro de esta sesión. Luego, al separar la sesión y cerrar sesión, se mantiene el terminal asociado con el proceso. Esto funciona al menos en el mundo * nix.


Podría suceder cuando su shell se bloquea mientras la impresión intentaba escribir los datos en él.


Soy nuevo aquí, así que perdona si me equivoco un poco cuando se trata del detalle del código. Recientemente pude averiguar qué causó el error de E / S de la declaración de impresión cuando el terminal asociado con la ejecución del script de Python está cerrado. Se debe a que la cadena que se va a imprimir en stdout / stderr es demasiado larga. En este caso, la cadena "out" es la culpable. Para solucionar este problema (sin tener que mantener el terminal abierto mientras se ejecuta la secuencia de comandos de Python), simplemente lea la línea de "salida" línea por línea, e imprima línea por línea, hasta llegar al final de la cadena de "salida". Algo como:

while true: ln=out.readline() if not ln: break print ln.strip("/n") # print without new line

El mismo problema ocurre si imprime la lista completa de cadenas en la pantalla. Simplemente imprima la lista un artículo por un artículo. ¡Espero que ayude!


Tuve un problema muy similar. Tuve un programa que estaba lanzando varios otros programas utilizando el módulo de subproceso. Esos subprocesos imprimirían la salida al terminal. Lo que encontré fue que cuando cerré el programa principal, no finalizó los subprocesos automáticamente (como había supuesto), sino que continuaron ejecutándose. Entonces, si terminé tanto el programa principal como el terminal en el que se había iniciado desde *, los subprocesos ya no tenían un terminal conectado a su salida estándar, y arrojaría un error IOError. Espero que esto te ayude.

* NB: debe hacerse en este orden. Si solo mata la terminal, (por alguna razón) eso mataría tanto al programa principal como a los subprocesos.