Странная ошибка при попытке записи в mmap под windows - PullRequest
1 голос
/ 13 июля 2010

Этот простой код 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] Том для файла имеетбыло изменено извне, так что открытый файл больше не действителен

Есть идеи почему?

Ответы [ 3 ]

4 голосов
/ 13 июля 2010

Из документации :

Если длина равна 0, максимальная длина карты равна текущему размеру файла, за исключением того, что если файл пуст, Windows поднимаетисключение (вы не можете создать пустое отображение в Windows).

Вы открываете файл с помощью "w +" - файл усекается ... (размер = 0)

4 голосов
/ 13 июля 2010

Скорее всего, потому что w+ усекает файл, и Windows выдает ошибку при попытке создать пустое сопоставление из этого файла длины 0. Вместо этого используйте r+.

Также вы не должныt use access=mmap.ACCESS_READ|mmap.ACCESS_WRITE:

>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3

Другими словами, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE совпадает с access=mmap.ACCESS_COPY.Скорее всего, вам нужно access=mmap.ACCESS_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:http://docs.python.org/library/mmap.html)

0 голосов
/ 23 января 2016

FYI - с питоном 2.7.6

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

чтение r + b, чтобы обойти \ x1a SUB-символы в данных, которые рассматриваются как конец файла

...