Linux上的Python mmap'权限被拒绝'

tMC*_*tMC 18 python mmap permission-denied

我有一个非常大的文件,我正试图用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
>>> 
Run Code Online (Sandbox Code Playgroud)

(使用内置的open()工作通过python docs示例,但它似乎在读取和写入模式下打开文件的多个句柄.我需要的mmap.mmap方法是文件编号,所以我不认为我需要创建一个file对象;因此我尝试使用os.open())

Bob*_*ers 35

我认为这是一个标志问题,请尝试以只读方式打开:

mfd = os.open('BigFile', os.O_RDONLY)
Run Code Online (Sandbox Code Playgroud)

默认情况下,mmap.mmap会尝试映射读/写,因此只需映射只读:

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)
Run Code Online (Sandbox Code Playgroud)

  • 默认情况下,os.open()以只读方式打开文件,因此您不需要"os.O_RDONLY".重要的是"prot = mmap.PROT_READ",因为如果文件已使用只读权限打开,则无法使用写入权限对文件进行内存映射. (3认同)

Chr*_*nte 9

尝试将文件模式设置为r+.这在Linux上对我有用:

mfd = os.open('BigFile', "r+")
Run Code Online (Sandbox Code Playgroud)

然后这对我来说很正常:

mfile = mmap.mmap(mfd, 0)
Run Code Online (Sandbox Code Playgroud)


Rob*_*obM 5

在我的情况下发生此错误是因为我试图在不指定显式大小的情况下打开块设备.

FWIW你不能使用os.stat/ os.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)
Run Code Online (Sandbox Code Playgroud)