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

kuz*_*roo 2 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
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 7

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

关于fdopen(3)的linux手册说

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


在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.

file是字符串或字节对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符.(如果给出了文件描述符,则在关闭返回的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.
Run Code Online (Sandbox Code Playgroud)