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.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)
【讨论】:
你的意思是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:权限被拒绝