Подтвердить что ты не робот

Python mmap 'Permission denied' в Linux

У меня есть действительно большой файл, который я пытаюсь открыть с помощью 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())

4b9b3361

Ответ 1

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

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

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

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)

Ответ 2

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

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 = fh.tell()
fh = f.fileno()

m = mmap.mmap(fh, size, mmap.MAP_PRIVATE, mmap.PROT_READ)

Ответ 3

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

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

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

mfile = mmap.mmap(mfd, 0)

Ответ 4

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

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

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