Python mmap 在Linux上“权限被拒绝”

24 投票
4 回答
20087 浏览
提问于 2025-04-16 19:13

我有一个非常大的文件想用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.statos.fstat 来获取块设备的大小(它的大小总是0),不过你可以使用 file.seekfile.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)

撰写回答