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()
)
Ответы
Ответ 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 должны быть синхронизированы с разрешениями на открытие файла (как чтение, запись, так и чтение/запись).