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)
在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.fdopen是open内置函数的包装器/几乎别名:
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)