Ho ereditato un codice che è periodicamente (casualmente) in mancanza a causa di un errore di input/output viene sollevata durante una chiamata per la stampa. Sto cercando di determinare la causa dell'eccezione (o almeno, meglio capirla) e come gestirla correttamente.IOError Input/Output degli errori durante la stampa
Quando si esegue la seguente riga di Python (in 2.6.6 interprete, in esecuzione su CentOS 5.5):
print >> sys.stderr, 'Unable to do something: %s' % command
L'eccezione viene sollevata (traceback omesso):
IOError: [Errno 5] Input/output error
Per contesto , questo è generalmente ciò che la funzione più grande sta tentando di fare al 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 sintassinon mi è particolarmente familiare, non è qualcosa che uso spesso, e capisco che è forse lo least preferred way di scrivere su stderr. Tuttavia, non credo che le alternative possano risolvere il problema sottostante.
Dalla documentazione che ho letto, IOError 5 è spesso in modo abusivo, e un po 'vagamente definito, con i diversi sistemi operativi che utilizzano per coprire problemi diversi. Il meglio che posso vedere nel mio caso è che il processo python non è più collegato al terminale/pty.
Come meglio posso dire che nulla sta disconnettendo il processo dai flussi stdout/stderr - il terminale è ancora aperto per esempio, e tutto 'sembra' va bene. Potrebbe essere causato dal processo figlio che termina in modo impuro? Cos'altro potrebbe essere una causa di questo problema - o quali altri passi potrei introdurre per eseguire il debugging ulteriormente?
In termini di gestione dell'eccezione, posso ovviamente prenderlo, ma suppongo che questo significhi che non sarò in grado di stampare su stdout/stderr per il resto dell'esecuzione? Posso riattaccare a questi flussi in qualche modo, magari ripristinando sys.stdout
a sys.__stdout__
ecc.? In questo caso non essere in grado di scrivere su stdout/stderr non è considerato fatale, ma se è un'indicazione di qualcosa che sta iniziando a sbagliare preferirei una cauzione anticipata.
Credo che in ultima analisi, sono a un po 'di una perdita da dove iniziare il debug questo ...
posso vedere solo poche persone hanno visitato questa domanda, senza commenti/risposte. Se la domanda è scarsamente strutturata/non chiara, ti prego di aiutarmi a migliorarla in modo che possa lavorare per una risposta. –
Sto anche espirando questo errore. Così fastidioso per ottenere questo errore a volte. –
Non ti preoccupare per poche risposte; la tua domanda e il tuo formato sono fantastici; questa è semplicemente una domanda difficile a cui rispondere. – culix