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

Posted

技术标签:

【中文标题】Linux上的Python mmap“权限被拒绝”【英文标题】:Python mmap 'Permission denied' on Linux 【发布时间】: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 后,内置对我来说工作得很好。 【参考方案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 构建权限应与文件打开权限(读、写或读/写)同步。

【讨论】:

以上是关于Linux上的Python mmap“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

权限被拒绝错误:Windows Gitbash 上的 Python 3.8

获取内部服务器错误,权限被拒绝在centos linux上的apache下运行cgi

Windows 上的 Gcloud 命令(使用 git bash)正在记录错误:WindowsApps/python3:权限被拒绝

Docker 上的 Jupyter 笔记本 - 权限被拒绝

WSL2 和 Docker 桌面上的 Postgres 卷挂载:PGDATA 文件夹上的权限被拒绝

用户模式权限被拒绝绑定到套接字