python mmap 的 flush() 在 ACCESS_COPY 下无效

2 投票
1 回答
947 浏览
提问于 2025-04-30 18:12

我正在尝试以ACCESS_COPY模式来映射一个文件。然后我写入了一个字符并进行了刷新,但flush()返回了失败,修改的内容没有写回到文件中。有人知道为什么吗?谢谢。

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

import os, mmap

f = open('etc.test', 'r+b')

mapped = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_COPY)
print mapped[0]
mapped[0] = 'R'
print mapped.flush()  <--- returns 0 (error on Windows)
mapped.close()
f.close()
暂无标签

1 个回答

1

我找到了答案:

确实,这是预期的行为。从Python的源代码来看:

    if (self->access == ACCESS_READ || self->access == ACCESS_COPY)
    return PyLong_FromLong(0);

所以,如果使用ACCESS_COPY,它会返回0。这是正常的,Windows的API就是这样工作的,COW(写时复制)只在内存中使用,并不会被写回。

不过,你可以通过f.write()把所有数据写回去。

撰写回答