Python mmap «В доступе отказано» в Linux - PullRequest
18 голосов
/ 09 июня 2011

У меня действительно большой файл, который я пытаюсь открыть с помощью mmap, и мне отказано в разрешении. Я пробовал разные флаги и режимы для os.open, но он просто не работает для меня.

Что я делаю не так?

>>> import os,mmap
>>> mfd = os.open('BigFile', 0)
>>> mfile = mmap.mmap(mfd, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
mmap.error: [Errno 13] Permission denied
>>> 

(использование встроенного open() работает через пример документации на python, но, похоже, он открывает более одного дескриптора файла как в режиме чтения, так и в режиме записи. Все, что мне нужно для метода mmap.mmap, - это номер файла , поэтому я не буду предполагать, что мне нужно создать file объект, поэтому моя попытка использовать os.open())

Ответы [ 4 ]

32 голосов
/ 09 июня 2011

Я думаю, это проблема с флагами, попробуйте открыть только для чтения:

mfd = os.open('BigFile', os.O_RDONLY)

и mmap.mmap по умолчанию пытается сопоставить чтение / запись, поэтому просто сопоставьте только чтение:

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)
6 голосов
/ 20 января 2013

Попробуйте установить режим файла на r+. Это работало для меня в Linux:

mfd = os.open('BigFile', "r+")

Тогда это работало для меня как обычно:

mfile = mmap.mmap(mfd, 0)
5 голосов
/ 12 февраля 2012

В моем случае эта ошибка произошла, потому что я пытался открыть блочное устройство без указания явного размера.

FWIW, вы не можете использовать os.stat / os.fstat с блочным устройством для получения размера устройства (который всегда равен 0), но вы можете использовать file.seek и file.tell:

f = file("/dev/loop0", "rb")
f.seek(0, 2)  # Seek relative to end of file
size = f.tell()
fh = f.fileno()

m = mmap.mmap(f, size, mmap.MAP_PRIVATE, mmap.PROT_READ)
0 голосов
/ 02 января 2016

Межплатформенный вызов из mmap может быть выполнен с использованием параметра access:

mfd = os.open('BigFile', os.O_RDONLY)
mm = mmap.mmap(mfd, 0, access=mmap.ACCESS_READ)

Разрешения построения mmap должны быть синхронизированы с разрешениями на открытие файлов (обачитать, писать или читать / писать).

...