Python 尝试在windows下写入mmap时出现奇怪的错误

Python 尝试在windows下写入mmap时出现奇怪的错误,python,windows,mmap,Python,Windows,Mmap,下面是简单的python代码: import mmap with file("o:/temp/mmap.test", "w+b") as fp: m = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE) m.write("Hello world!") 产生以下错误(在mmap.mmap(…)行): WindowsError:[错误1006]文件的卷已被外部更改,因此打开的文

下面是简单的python代码:

import mmap  

with file("o:/temp/mmap.test", "w+b") as fp:  
    m = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE)  
    m.write("Hello world!")  
产生以下错误(在mmap.mmap(…)行):
WindowsError:[错误1006]文件的卷已被外部更改,因此打开的文件不再有效


知道为什么吗

很可能是因为
w+
截断了文件,而Windows在尝试从长度为0的文件创建空映射时出错。改用
r+

同样,您不应该使用
access=mmap.access\u READ | mmap.access\u WRITE

>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3
换句话说,
access=mmap.access\u READ | mmap.access\u WRITE
access=mmap.access\u COPY
相同。您想要的很可能是
access=mmap.access\u WRITE
,而在Windows上,如果不显式使用该参数,您将得到该参数

试试这个:

import mmap  

with file("o:/temp/mmap.test", "r+b") as fp:  
    m = mmap.mmap(fp.fileno(), 0)  
    m.write("Hello world!")  

(mmap docs:)

很可能是因为
w+
截断了文件,Windows在尝试从长度为0的文件创建空映射时出错。改用
r+

同样,您不应该使用
access=mmap.access\u READ | mmap.access\u WRITE

>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3
换句话说,
access=mmap.access\u READ | mmap.access\u WRITE
access=mmap.access\u COPY
相同。您想要的很可能是
access=mmap.access\u WRITE
,而在Windows上,如果不显式使用该参数,您将得到该参数

试试这个:

import mmap  

with file("o:/temp/mmap.test", "r+b") as fp:  
    m = mmap.mmap(fp.fileno(), 0)  
    m.write("Hello world!")  
(mmap文档:)

来自:

如果长度为0,则最大长度为 地图是地图的当前大小 文件,除非该文件为空 Windows引发了一个异常(您需要) 无法在上创建空映射 窗户)

您正在用“w+”打开文件-文件被截断。。。(大小=0)

来自:

如果长度为0,则最大长度为 地图是地图的当前大小 文件,除非该文件为空 Windows引发了一个异常(您需要) 无法在上创建空映射 窗户)


您正在用“w+”打开文件-文件被截断。。。(大小=0)

供参考-使用python 2.7.6

dataFile = open(dFile, mode='r+b') # failed with windows access error
dataFile = open(dFile, 'r+b')      # works

读取r+b,以绕过数据中的\x1a子字符,将其视为文件结尾

FYI-使用python 2.7.6

dataFile = open(dFile, mode='r+b') # failed with windows access error
dataFile = open(dFile, 'r+b')      # works

读取r+b,以绕过数据中的\x1a子字符(视为文件结尾)

尝试了r+,但它给出了相同的错误。access=确实是多余的,但添加它只是为了确保windows不会以奇怪的方式说“权限被拒绝”@Paul-文件中是否填充了数据?长度=0将仅适用于非空文件。如果指定一个长度,那么文件将被扩展。一切正常:令人困惑的部分是错误消息的文本(请参阅我对Jeremy的评论)。我想即使是一个“总是看到生活光明的一面”也会是一个更好的文本来解释这个错误。@Paul:特别是当它使计算机在抛出时发出哨声时。尝试了r+,但它给出了相同的错误。access=确实是多余的,但添加它只是为了确保windows不会以奇怪的方式说“权限被拒绝”@Paul-文件中是否填充了数据?长度=0将仅适用于非空文件。如果指定一个长度,那么文件将被扩展。一切正常:令人困惑的部分是错误消息的文本(请参阅我对Jeremy的评论)。我想,即使是“永远看生活光明的一面”也能更好地解释这个错误。@Paul:尤其是当电脑被抛出时,它会发出汽笛声。是的,你是对的。我在错误消息的奇怪文本中徘徊,但刚刚发现1006只是CreateFileMapping()产生的Win32错误文件无效…是的,你是对的。我在错误消息的奇怪文本中徘徊,但刚刚发现1006只是CreateFileMapping()产生的Win32错误文件无效。。。