2011-10-07 11 views
38

Sto utilizzando un software scientifico che include uno script Python che sta chiamando os.system() che viene utilizzato per eseguire un altro programma scientifico. Mentre il sottoprocesso è in funzione, Python in alcune stampe punto seguente:Cosa può portare a "IOError: [Errno 9] Bad file descriptor" durante os.system()?

close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

Credo che questo messaggio viene stampato allo stesso tempo come os.system() ritorni.

Le mie domande ora sono:

Quali condizioni possono portare a questo tipo di IOError? Cosa significa esattamente? Che cosa significa per il sottoprocesso invocato da os.system()?

+2

Nota: utilizzando il modulo 'subprocess' [è preferibile] (http://docs.python.org/library/os.html#os.system) su 'os.system()'. –

+0

:-) Lo so e ci sono molte cose non perfette in questo software. –

risposta

35

si riceve questo messaggio di errore se un file Python è stato chiuso da "fuori", cioè non dal metodo dell'oggetto file di close():

>>> f = open(".bashrc") 
>>> os.close(f.fileno()) 
>>> del f 
close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

La linea del f elimina l'ultimo riferimento all'oggetto di file, causando il suo distruttore file.__del__ da chiamare. Lo stato interno dell'oggetto file indica che il file è ancora aperto poiché f.close() non è mai stato chiamato, quindi il distruttore tenta di chiudere il file. Successivamente, il sistema operativo genera un errore a causa del tentativo di chiudere un file che non è aperto.

Dal momento che l'attuazione di os.system() non crea oggetti file Python, non sembra probabile che la chiamata system() è l'origine dell'errore. Forse potresti mostrare un po 'di codice in più?

+0

Grazie .. Ho già avuto questo sospetto. Mostrare più codice non avrebbe senso a questo punto, perché questo script Python è abbastanza grande, non ben strutturato e non ben scritto. Non ho una buona panoramica finora. Con l'aiuto delle tue informazioni, cercherò di trovare prima io il problema. –

+0

Un'altra domanda: nel tuo esempio, hai usato 'del f' invece di' f.close() ', che avrebbe portato a un traceback. L'equivalente 'del f' di ciò che accade durante la raccolta dei rifiuti di Python? –

+0

La mia prima ipotesi è che abbia qualcosa a che fare con lo script che usa la parallelizzazione MPI - cioè i descrittori di file condivisi tra diversi processi. –

10

È possibile ottenere questo errore se si utilizza la modalità errata all'apertura del file. Per esempio:

with open(output, 'wb') as output_file: 
     print output_file.read() 

In quel codice, voglio leggere il file, ma la modalità wb invece di r o io uso r+

Problemi correlati