请教Python mmap'共享内存权限被拒绝'


def duqnc():   #读取共享内存

    SHMEMSIZE = 500000#len(str)
    file_name = "coco"
    # python读取共享内存
    shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)
    print(shmem.read(SHMEMSIZE).decode('ASCII'))
    shmem.close()
    return


  File "J:\dll\yolov5\yolov5\tesrxxx.py", line 9, in duqnc
    shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)
PermissionError: [WinError 5] 拒绝访问。

我想易语言和python数据传输,于是就用了mmap
但发现个问题,传输小一点的数据,可以正常使用,但是易语言那边写入一个图片字节集数据时,python这边读取,就会报错,拒绝访问,请问有什么解决办法吗。

、下面是易语言的代码

img

  • img

易语言这边其实很简单,就调用了两个API

我主要不明白python这边,拒绝访问怎么解决 或者有什么其他办法可以实现,易语言端传输图片字节集到python UDP我试过了,数据大一点就传不过来 还慢

供参考:https://zhuanlan.zhihu.com/p/166330573
https://www.codingdict.com/questions/164229

第二个参数SHMEMSIZE指代的是字节数,以500000为例,那就是500000/1024/1024=0.47MB,的确是比较小,所以大文件一定要把设置到足够大才行。

添加个for循环,每次读取1024个字节呢?

mmap()的第一个参数应该为fd,你指定了0,代表标准输入,不确定你成功的情况是怎么样的,理论来说不应该读取到coco文件的内容
第二个参数为映射文件长度,指定0代表文件大小,或者显示指定文件的大小。指定一个大于文件大小的值,如果大于一个pagesize会报错。
所以你试试下面的代码

def duqnc():
    file_name = "coco"
    fd = os.open(file_name, os.O_RDONLY)
    size = os.lseek(fd, 0, os.SEEK_END)
    # python读取共享内存
    shmem = mmap.mmap(fd, size, None, mmap.ACCESS_READ)

    print(shmem.read(size).decode("utf-8"))
    shmem.close()
    os.close(fd)
    return