导致在os.system()中出现“IOError: [Errno 9] 无效文件描述符”的原因是什么?

86 投票
3 回答
249124 浏览
提问于 2025-04-17 03:51

我正在使用一个科学软件,其中包含一个调用了 os.system() 的 Python 脚本,这个函数用来运行另一个科学程序。在这个子程序运行的时候,Python 有时候会打印出以下内容:

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

我认为这个信息是在 os.system() 返回的同时打印出来的。

我现在有几个问题:

是什么情况会导致这种类型的 IOError?这到底是什么意思?对于通过 os.system() 调用的子程序来说,这又意味着什么呢?

3 个回答

0

如果你的工作目录开启了勒索软件保护,你可能会遇到这个错误。Windows系统不允许任何第三方应用程序在被勒索软件保护的目录中修改文件。要解决这个问题,你可以按照以下步骤操作:“Windows安全中心 -> 病毒和威胁防护 -> 管理勒索软件保护 -> 允许应用通过受控文件夹访问”。

然后点击“添加允许的应用”,再添加“Python[版本].exe”。

19

如果你在打开文件的时候用错了模式,就可能会出现这个错误。比如说:

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

在这段代码中,我想要读取文件,但我用了 wb 模式,而不是 rr+

70

当你看到这个错误信息时,说明一个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()这个调用不太可能是错误的来源。也许你可以提供更多的代码来帮助理解?

撰写回答