在 os.system() 期间,啥会导致“IOError: [Errno 9] Bad file descriptor”?

Posted

技术标签:

【中文标题】在 os.system() 期间,啥会导致“IOError: [Errno 9] Bad file descriptor”?【英文标题】:What can lead to "IOError: [Errno 9] Bad file descriptor" during os.system()?在 os.system() 期间,什么会导致“IOError: [Errno 9] Bad file descriptor”? 【发布时间】:2011-12-02 22:20:10 【问题描述】:

我正在使用一个科学软件,其中包括一个调用os.system() 的 Python 脚本,该脚本用于运行另一个科学程序。当子进程运行时,Python 有时会打印以下内容:

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

我相信这条消息是在os.system() 返回的同时打印出来的。

我现在的问题是:

哪些情况会导致这种类型的 IOError?它到底是什么意思?被os.system()调用的子进程是什么意思?

【问题讨论】:

注意:使用subprocess模块is preferable而不是os.system() :-) 我知道,而且这个软件中有很多不完美的东西。 【参考方案1】:

如果 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() 调用似乎不太可能是错误的根源。也许您可以显示更多代码?

【讨论】:

谢谢.. 我已经有这个怀疑了。在这一点上显示更多代码没有意义,因为这个 Python 脚本很大,结构不好,编写也不好。到目前为止,我还没有一个很好的概述。在您的信息的帮助下,我会先尝试自己找到问题。 还有一个问题:在您的示例中,您使用了del f 而不是f.close(),这将导致回溯。 del f 是否等同于 Python 垃圾收集期间发生的情况? @Jan-PhilipGehrcke: del f 只是删除名称f,减少名称指向的对象的引用计数。如果没有其他引用,这将触发垃圾回收,包括调用对象的__del__() 方法。由于您在os.system() 调用中收到错误消息,我怀疑这是由于隐式垃圾收集,所以我使用del 来演示效果。单行 os.close(open(".bashrc").fileno()) 产生相同的错误。 @Jan-PhilipGehrcke:如果您使用的是 Python 2.6 或 2.7,您可以尝试破解:import io; __builtins__.open = io.open 用来自 io 模块的版本替换了内置的 open()(从 3.0 向后移植) )。 open() 的新版本速度较慢,但​​如果文件已经关闭则忽略。 @Jan-Philip:是的,如果 MPI 传递操作系统级别的文件描述符而不是 Python 文件对象。如果您使用的是 MPI,我认为这是一个非常可能的原因。【参考方案2】:

如果您在打开文件时使用了错误的模式,则会出现此错误。例如:

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

在该代码中,我想读取文件,但我使用模式 wb 而不是 rr+

【讨论】:

以上是关于在 os.system() 期间,啥会导致“IOError: [Errno 9] Bad file descriptor”?的主要内容,如果未能解决你的问题,请参考以下文章

在 pypi.python.org 上,啥会导致显式搜索返回隐藏的旧版本

virtualenvwrapper 安装失败 - “啥会导致 ImportError:没有名为核心的模块”等?

尝试访问本地文件时,啥会导致 curl 返回 false?

MSMQ:从队列接收时,啥会导致“资源不足以执行操作”错误?

React-Native:啥会导致模块为空?

当检查为 0 时,啥会导致外键异常?