Python mmap 在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()
的原因。)
4 个回答
6
在我的情况下,这个错误发生是因为我试图打开一个块设备,但没有明确指定大小。
顺便说一下,你不能用 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)
12
试着把文件模式设置为 r+
。在Linux上,这对我有效:
mfd = os.open('BigFile', "r+")
然后这对我来说就像平常一样有效:
mfile = mmap.mmap(mfd, 0)
43
我觉得这是一个标志的问题,试着以只读方式打开:
mfd = os.open('BigFile', os.O_RDONLY)
而mmap.mmap默认是尝试以读写方式映射,所以只需以只读方式映射:
mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)