python - 为什么 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
差异,但仍然得到相同的结果。
我在文档中看不到任何明显的东西:
- https://docs.python.org/3.8/library/os.html#os.fdopen
- https://docs.python.org/2.7/library/os.html#os.fdopen
在 MacOS 10.14.6 上运行
解决方案
我不确定 Python 是否会跟踪这一点,但鉴于您flags
使用过 in os.open
,我会说这rb+
实际上是正确的。
你调用os.open
了标志“读/写”和“如果不存在则创建”,但没有“截断”(O_TRUNC
)。这正是 moderb+
和之间的区别wb+
。假设 Python 跟踪了您的flags
,这是正确的模式。
推荐阅读
- typescript - Typescript 对象初始化程序错误,用于在构造函数简写中声明的默认属性的可选
- html - TypeError:无法读取 reactJS 中未定义的属性“拆分”
- python - 当我按下屏幕键盘按钮时,刽子手无法正常工作
- python - 实现模型(自动编码器 + CNN)如何确保我的模型不会过拟合?
- python - Pandas:合并两个具有相同值的不同键
- java - 来自应用程序或外部服务器的 Cron 作业
- javascript - 使用 vue 或 javascript 从网站实时抓取 html
- python - Pytest:使用使用另一个夹具作为输入的夹具参数化单元测试
- apache-spark - 为什么 Spark 需要为它运行的每个任务序列化 RDD 中的数据?
- python - 清洁 Anaconda 重新开始