我曾认为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()
?
我错过了什么吗?
我找到了一个 bug 吗?
P.S. Python 版本字符串为Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)
,以防有人无法复现。
P.P.S. 在 Py2.7 Linux 上也存在同样的问题。但是在 Py3.3 中不会出现此问题。
opendir
和readdir
做得更好)。虽然Python文件确实是文件,但当您尝试在文件目录描述符上创建文件对象时,它会因异常而中断。就是这样。 - user3159253os.fdopen
是否允许在不返回文件对象的情况下使用文件描述符。 - Dima Tisnek