首页 > 解决方案 > 为什么 os.fdopen 忽略模式?

问题描述

这段代码在 Python 2.7.16 和 3.8.3 上运行时会产生不同的结果:

import tempfile
import os

fd, lockfile = tempfile.mkstemp()
flags = os.O_RDWR | os.O_CREAT
mode = 'w+b'

fd = os.open(lockfile, flags)
fileobj = os.fdopen(fd, mode)

print(fileobj.mode)

os.remove(lockfile)

在 2.7 中它w+b按预期打印,但在 3.8 中它打印rb+. 为什么不以这种方式尊重模式参数?

我试过手动创建一个文件来减少tempfile差异,但仍然得到相同的结果。

我在文档中看不到任何明显的东西:

在 MacOS 10.14.6 上运行

标签: pythonpython-3.xpython-2.7

解决方案


我不确定 Python 是否会跟踪这一点,但鉴于您flags使用过 in os.open,我会说这rb+实际上是正确的。

你调用os.open了标志“读/写”和“如果不存在则创建”,但没有“截断”(O_TRUNC)。这正是 moderb+和之间的区别wb+。假设 Python 跟踪了您的flags,这是正确的模式。


推荐阅读