Python mmap 'Permission denied' on Linux

时间秒杀一切 提交于 2019-12-22 02:32:38

问题


I have a really large file I'm trying to open with mmap and its giving me permission denied. I've tried different flags and modes to the os.open but its just not working for me.

What am I doing wrong?

>>> 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
>>> 

(using the built in open() works via the python docs example, but it seems to open more than one handle to the file both in read & write mode. All i need for the mmap.mmap method is the file number, so I wouldn't assume i need to create a file object; hence my attempt at using os.open())


回答1:


I think its a flags issue, try opening as read only:

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

and mmap.mmap by default tries to map read/write, so just map read only:

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



回答2:


Try setting the file mode to r+. That worked for me on Linux:

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

Then this worked for me as normal:

mfile = mmap.mmap(mfd, 0)



回答3:


In my case this error occurred because I was attempting to open a block device without specifying an explicit size.

FWIW you cannot use os.stat / os.fstat with a block device to obtain the device's size (which is always 0), but you can use file.seek and 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)



回答4:


The cross-platform call of mmap can be performed using access parameter:

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

The mmap construction permissions should be synced with the file open permissions (both read, write, or read/write).



来源:https://stackoverflow.com/questions/6286592/python-mmap-permission-denied-on-linux

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!