2011-10-07 226 views
38

我正在使用一个科学软件,包括一个叫做os.system()的Python脚本,它用于运行另一个科学程序。当子进程正在运行,巨蟒在某些时候打印以下内容:在os.system()期间会导致“IOError:[Errno 9]错误的文件描述符”是什么?

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

我相信这个消息是在同一时间os.system()回报打印。

我现在的问题是:

哪些情况会导致这种类型的IOError?这究竟意味着什么?这对os.system()调用的子进程意味着什么?

+2

注意:使用'subprocess'模块[优选(HTTP:/ /docs.python.org/library/os.html#os.system)通过'os.system()'。 –

+0

:-)我知道这个软件中有很多非完美的东西。 –

回答

35

您收到此错误消息,如果一个Python文件是从“外面”关闭,即不是从文件对象的close()方法:

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

线del f删除最后一个引用文件对象,引起它的析构函数file.__del__被调用。文件对象的内部状态表明该文件仍处于打开状态,因为从未调用过f.close(),所以析构函数试图关闭该文件。操作系统随后会抛出一个错误,因为尝试关闭未打开的文件。

由于os.system()的实施不会产生任何的Python文件对象,它似乎并不可能是system()调用是错误的起源。也许你可以展示更多的代码?

+0

谢谢..我已经有这个怀疑。显示更多的代码在这一点上是没有意义的,因为这个Python脚本非常大,结构不够好,写得不好。到目前为止我没有很好的概述。在您的信息的帮助下,我会先尝试自己找到问题。 –

+0

还有一个问题:在你的例子中,你使用'del f'而不是'f.close()',这会导致回溯。 'del f'与Python垃圾收集过程中发生的情况相同吗? –

+0

我的第一个猜测是它与使用MPI并行化的脚本有关 - 即在不同进程之间共享文件描述符。 –

10

如果打开文件时使用错误模式,则可能会出现此错误。例如:

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

在该代码中,我要读取的文件,但我用模式wb代替rr+

相关问题