gpt4 book ai didi

python - 什么是 os.fdopen() 语义?

转载 作者:太空狗 更新时间:2023-10-29 11:14:21 24 4
gpt4 key购买 nike

我曾经认为 os.fdopen() 要么吃掉文件描述符并返回一个文件 io 对象,要么引发异常。

例如:

fd = os.open("/etc/passwd", os.O_RDONLY)
try: os.fdopen(fd, "w")
except: os.close(fd) # prevent memory leak

然而,这些语义似乎并不总是成立。

这是一个在 OSX 上的例子:

In [1]: import os

In [2]: os.open("/", os.O_RDONLY, 0660)
Out[2]: 5

In [3]: os.fdopen(5, "rb")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-3-3ca4d619250e> in <module>()
----> 1 os.fdopen(5, "rb")

IOError: [Errno 21] Is a directory: '<fdopen>'

In [4]: os.close(5)
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-4-76713e571514> in <module>()
----> 1 os.close(5)

OSError: [Errno 9] Bad file descriptor

似乎 os.fdopen() 都吃掉了我的文件描述符 5 并引发了异常...

os.fdopen() 有安全的使用方法吗?

我错过了什么吗?

我找到错误了吗?

附言Python 版本字符串 Python 2.7.6(v2.7.6:3a1db0d2747e,2013 年 11 月 10 日,00:42:54),以防有人无法用他们的复制。

附言Py2.7 Linux 也存在同样的问题。然而 Py3.3 没有出现上述问题。

最佳答案

Python 检查生成的 FILE* 在创建 python 文件对象并将其存储在 python 对象中后不引用目录。由于目录检查中的错误,文件对象被取消引用(因为它不会被返回),这导致调用析构函数关闭文件。

我同意,如果文档显示它可以对传入的文件描述符产生什么影响,那就太好了。我不确定您想要什么作为使用 fdopen 的“安全”方式。如果你打算在失败时关闭文件描述符,那么由 python 关闭有什么关系?只需使用

try: os.close(fd)
except: pass

消除次要异常。

fill_file_fieldsPyFile_FromFile 调用填写文件对象的成员,它调用dircheck填充字段后的功能。这导致 fill_file_fields 返回 NULL 所以 PyFile_FromFile does Py_DECREF(f);其中 f 是文件对象。由于这是最后一次引用,因此释放器 file_dealloc被称为调用 close_the_file这(惊喜,惊喜)关闭了文件。

在 3.4 分支中,dircheck 是从 fileio_init 开始的它使用标志变量 fd_is_own 来确定文件是否应该在错误情况下关闭。

关于python - 什么是 os.fdopen() 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22966655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com