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

发布于 2024-11-14 23:22:11 字数 547 浏览 4 评论 0原文

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

I have a really large file I'm trying to open with mmap and its giving me permission denied. I've tried different flags and modes to the os.open but its just not working for me.

What am I doing wrong?

>>> 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
>>> 

(using the built in open() works via the python docs example, but it seems to open more than one handle to the file both in read & write mode. All i need for the mmap.mmap method is the file number, so I wouldn't assume i need to create a file object; hence my attempt at using os.open())

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

墟烟 2024-11-21 23:22:11

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

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

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

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

I think its a flags issue, try opening as read only:

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

and mmap.mmap by default tries to map read/write, so just map read only:

mfile = mmap.mmap(mfd, 0, prot=mmap.PROT_READ)
山色无中 2024-11-21 23:22:11

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

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

然后这对我来说正常:

mfile = mmap.mmap(mfd, 0)

Try setting the file mode to r+. That worked for me on Linux:

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

Then this worked for me as normal:

mfile = mmap.mmap(mfd, 0)
虫児飞 2024-11-21 23:22:11

就我而言,发生此错误是因为我试图打开块设备而不指定显式大小。

FWIW,您不能将 os.stat / os.fstat 与块设备一起使用来获取设备的大小(始终为 0),但您可以使用 file。查找和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)

In my case this error occurred because I was attempting to open a block device without specifying an explicit size.

FWIW you cannot use os.stat / os.fstat with a block device to obtain the device's size (which is always 0), but you can use file.seek and 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)
说好的呢 2024-11-21 23:22:11

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

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

mmap构建权限需要与文件打开权限同步(都读取、写入或读/写)。

The cross-platform call of mmap can be performed using access parameter:

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

The mmap construction permissions should be synced with the file open permissions (both read, write, or read/write).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文