2011-10-07 16 views
38

Estoy usando un software científico que incluye un script de Python que llama al os.system() que se usa para ejecutar otro programa científico. Mientras que el subproceso se está ejecutando, Python en algunas impresiones de punto lo siguiente:¿Qué puede llevar a "IOError: [Errno 9] Descriptor de archivo incorrecto" durante os.system()?

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

creo que este mensaje se imprime al mismo tiempo que os.system() devoluciones.

Mis preguntas ahora son:

Qué condiciones puede dar lugar a este tipo de IOError? ¿Qué significa exactamente? ¿Qué significa para el subproceso que ha sido invocado por os.system()?

+2

Nota: usando el módulo 'subprocess' [es preferible] (http://docs.python.org/library/os.html#os.system) sobre 'os.system()'. –

+0

:-) Lo sé y hay muchas cosas no perfectas en este software. –

Respuesta

35

recibe este mensaje de error si un archivo Python fue cerrado desde "el exterior", es decir, no desde el método del objeto de archivo close():

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

La línea del f borra la última referencia al objeto de archivo, causando su destructor file.__del__ para ser llamado. El estado interno del objeto de archivo indica que el archivo aún está abierto ya que nunca se llamó al f.close(), por lo que el destructor intenta cerrar el archivo. El SO posteriormente arroja un error debido al intento de cerrar un archivo que no está abierto.

Dado que la implementación de os.system() no crea ningún objeto de archivo Python, no parece probable que la llamada system() sea el origen del error. ¿Tal vez podrías mostrar un poco más de código?

+0

Gracias .. Ya tenía esta sospecha. Mostrar más código no tendría sentido en este punto, porque este script de Python es bastante grande, no está bien estructurado y no está bien escrito. No tengo una muy buena visión general hasta ahora. Con la ayuda de su información, primero intentaré encontrar el problema yo mismo. –

+0

Una pregunta más: en su ejemplo, utilizó 'del f' en lugar de' f.close() ', lo que hubiera resultado en un rastreo. ¿Es 'del f' equivalente con lo que sucede durante la recolección de basura de Python? –

+0

Mi primera conjetura es que tiene algo que ver con el script que hace uso de la paralelización de MPI, es decir, descriptores de archivos compartidos entre diferentes procesos. –

10

Puede obtener este error si utiliza el modo incorrecto al abrir el archivo. Por ejemplo:

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

En ese código, quiero leer el archivo, pero el modo en lugar de wbr o utilizo r+

Cuestiones relacionadas