我需要做什么来关闭我从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
答案 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.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。
文件是字符串或字节对象,给出路径名(绝对值) 或者相对于要打开的文件的当前工作目录 或要包装的文件的整数文件描述符。 (如果是文件 给定描述符,它在返回的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.