在 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
而不是 r
或 r+
【讨论】:
以上是关于在 os.system() 期间,啥会导致“IOError: [Errno 9] Bad file descriptor”?的主要内容,如果未能解决你的问题,请参考以下文章
在 pypi.python.org 上,啥会导致显式搜索返回隐藏的旧版本
virtualenvwrapper 安装失败 - “啥会导致 ImportError:没有名为核心的模块”等?