关闭我用过fdopen的文件描述符

时间:2014-07-27 19:40:47

标签: python file-io file-descriptor

我需要做什么来关闭我从os.open获得的文件描述符,然后与with os.fdopen一起使用?我从下面的代码中得到的OSError让我觉得答案可能是"没什么,"但是我无法在文档中找到确认信息。

fd = os.open(os.path.expanduser("~/Desktop/foo"), os.O_WRONLY)
with os.fdopen(fd, "wt") as file:
    pass
os.close(fd) # OSError: [Errno 9] Bad file descriptor

1 个答案:

答案 0 :(得分:6)

在Python 2中,通常在Python 3中,文件以fdopen打开,C标准IO拥有文件描述符。当文件以fclose关闭时,底层描述符也会关闭。因此,文件在with块结束时关闭。

fdopen(3)上的linux手册

  

fdopen()函数将流与现有文件相关联   描述符,fd。流的模式(值“r”,“r +”之一,   “w”,“w +”,“a”,“a +”)必须与文件的模式兼容   描述。新流的文件位置指示器设置为   属于fd,错误和文件结束指标   清除。模式“w”或“w +”不会导致文件截断。的的   文件描述符不是重复的,并且在流时将被关闭   由fdopen()创建的关闭。将fdopen()应用于a的结果   共享内存对象未定义。


在Python 3中os.fdopenopen内置函数的包装/几乎别名:

  

os.fdopen(fd, *args, **kwargs)

     

返回连接到文件描述符fd的打开文件对象。这是open()内置函数的别名,并接受相同的参数。唯一的区别是fdopen()的第一个参数必须始终是整数。

open文档的文档可以说明打开文件描述符:

  

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

     

打开文件并返回相应的文件对象。如果无法打开文件,则会引发OSError。

     

文件是字符串或字节对象,给出路径名(绝对值)   或者相对于要打开的文件的当前工作目录   或要包装的文件的整数文件描述符。 (如果是文件   给定描述符,它在返回的I / O对象时关闭   关闭,除非closefd设置为False。)

因此,如果希望在Python文件对象关闭时保持文件描述符的打开,则可以

fd = os.open(os.path.expanduser("~/Desktop/foo"), os.O_WRONLY)
with os.fdopen(fd, "wt", closefd=False) as file:
    pass

# I/O object dissociated but fd valid
os.close(fd) # no error.