在 os.system() 期间什么会导致“IOError: [Errno 9] Bad file detector”?

问题描述 投票:0回答:4

我正在使用一个科学软件,其中包含一个调用

os.system()
的 Python 脚本,该脚本用于运行另一个科学程序。当子进程运行时,Python 在某个时刻会打印以下内容:

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

我相信这条消息是在

os.system()
返回的同时打印的。

我现在的问题是:

哪些情况会导致此类IOError?它究竟意味着什么?对于

os.system()
调用的子流程意味着什么?

python subprocess posix file-descriptor ioerror
4个回答
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()
调用似乎不太可能是错误的根源。 也许您可以展示更多代码?


20
投票

如果打开文件时使用错误的模式,您可能会收到此错误。例如:

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

在该代码中,我想读取文件,但我使用模式

wb
而不是
r
r+


1
投票

如果您的工作目录启用了勒索软件防护,您可能会收到此错误。如果目录受 Windows 附带的勒索软件保护保护,则 Windows 不允许任何第三方应用程序对文件进行更改。您可以通过转到“Windows 安全 -> 病毒和威胁防护 -> 管理勒索软件防护 -> 允许应用程序通过受控文件夹访问”来纠正此问题

然后通过单击“添加允许的应用程序”来添加“Python[版本].exe”。


0
投票

这确实非常不安全,攻击者喜欢Python,他们知道你禁用保护来进行故障排除。或者,查看哪些文件夹受到勒索软件保护(对于我的 Windows 11,默认情况下是:文档、音乐、图片、视频、收藏夹),并考虑在另一个文件夹中创建文件。友情提醒,请备份您的重要数据:3 个副本、2 个媒体、1 个异地。

© www.soinside.com 2019 - 2024. All rights reserved.