如果有的话,我需要做些什么来关闭我从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
在Python 2中,通常在Python 3中,文件是用fdopen
打开的,C标准IO拥有文件描述符。当使用fclose
关闭文件时,底层描述符也被关闭。因此,该文件在with
块的末尾关闭。
fdopen
(3)上的linux手册说
fdopen()函数将流与现有文件关联起来描述符,fd。流的模式(值"r", "r+","w","w+","a","a+")必须与文件的模式兼容描述符。设置新流的文件位置指示器为属于fd的,错误和文件结束指示器为清除。模式"w"或"w+"不会导致文件的截断。的文件描述符未up'ed,并且将在流启动时关闭由fdopen()创建的已关闭。对a应用fdopen()的结果共享内存对象未定义
在Python 3中,os.fdopen
是open
内置函数的包装器/别名:
os.fdopen(fd, *args, **kwargs)
返回一个连接到文件描述符
fd
的打开文件对象。这是open()
内置函数的别名,并接受相同的参数。唯一的区别是fdopen()
的第一个参数必须总是一个整数。
open
文档的文档对打开文件描述符有这样的说明:
因此,如果您希望在Python文件对象关闭时保持文件描述符打开,您可以执行
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开文件并返回相应的文件对象。如果文件无法打开,则引发OSError。
文件是一个字符串或字节对象,给出路径名(绝对)(相对于要打开的文件的当前工作目录)或要包装的文件的整型文件描述符。(如果一个文件描述符,当返回的I/O对象为关闭,除非closefd被设置为False)
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.