【问题标题】:Python mmap 'Permission denied' on LinuxLinux上的Python mmap“权限被拒绝”
【发布时间】:2011-09-11 07:27:07
【问题描述】:

我有一个非常大的文件,我正在尝试使用 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())

【问题讨论】:

  • 愚蠢的问题,但是你有文件的读取权限吗?
  • 你为什么要通过os.open而不是内置的open()打开文件?尺寸?对于我使用 re 扫描的约 50 MB 文件(相对于您而言可能很小),在按照 Bobby 合并 prot=mmap.PROT_READ 后,内置对我来说工作得很好。

标签: python mmap permission-denied


【解决方案1】:

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

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

并且 mmap.mmap 默认尝试映射读/写,所以只映射只读:

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

【讨论】:

  • 默认情况下 os.open() 以只读方式打开文件,因此您不需要“os.O_RDONLY”。重要的是“prot=mmap.PROT_READ”,因为如果文件已以只读权限打开,则无法使用写入权限对文件进行内存映射。
  • @senarvi - python 2 文档说'默认模式是 0777(八进制),并且当前的 umask 值首先被屏蔽' - docs.python.org/2/library/os.html#os.open ,所以文件是打开 RO 还是 RW如果您省略模式,似乎取决于您的 umask。
  • 哦,你是对的。我没有注意到我们没有使用内置的 open()。
【解决方案2】:

在我的情况下,发生此错误是因为我试图打开块设备而不指定明确的大小。

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)

【讨论】:

  • 你的意思是f = open("/dev/loop0", "rb")size = f.tell()吗?
  • 糟糕,应该是size = f.tell() 我会解决这个问题。至于file()open(),在Python2 中file() 是有效的,我稍微喜欢它而不是open(),所以我会保留它。
【解决方案3】:

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

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

然后这对我正常工作:

mfile = mmap.mmap(mfd, 0)

【讨论】:

  • 我在尝试open('foo.txt', 'rwb')。谢谢你拯救我的理智。
  • @JonathonReinhart;不客气!这些标志对我来说毫无意义
【解决方案4】:

mmap跨平台调用可以使用access参数进行:

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

mmap 构建权限应与文件打开权限(读、写或读/写)同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2022-01-08
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多