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 recen开发者_开发百科t 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()
)
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)
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)
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)
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).
精彩评论