gpt4 book ai didi

将列表从 QSharedMemory 复制到 sip.voidptr 的 Pythonic 方法

转载 作者:行者123 更新时间:2023-11-30 22:12:13 24 4
gpt4 key购买 nike

我正在使用 PyQT5 和 QSharedMemory 类。我正在创建一个可以容纳 6 个 1 字节元素的共享内存。为了将这些元素复制到共享内存数组中,我循环遍历 python 列表中的元素,如以下代码片段所示:

f = shared_mem.data()
k = f.asarray()
memtocopy = [0,1,2,3,4,5]
for i in range(0,len(memtocopy)):
k[i] = memtocopy[i]
shared_mem.unlock()

这看起来非常不符合Python风格,并且类似于样板代码。我想知道是否有更合适的方法来达到相同的结果?

使用时

k[:] = memtocopy

或者:

k[:] = np.asarray(memtocopy,np.uint8)

它将失败并显示错误消息:

TypeError: can only assign another array of unsigned char to the slice

用于重现的整个测试代码如下所示:

from PyQt5 import QtCore 

# Create shared memory and attach it
shared_mem = QtCore.QSharedMemory()
shared_mem.setNativeKey("test")
shared_mem.create(4*6)
shared_mem.attach()


# Fill in
shared_mem.lock()
f = shared_mem.data()
k = f.asarray()

memtocopy = [0,1,2,3,4,5]

# Loop in question
for i in range(0,len(memtocopy)):
k[i] = memtocopy[i]

shared_mem.unlock()



# Read out
shared_mem.lock()
f1 = shared_mem.data()
k1 = f1.asarray()
shared_mem.unlock()

# Test results
if k1[0] == memtocopy[0]:
print("success!")
else:
print("fail!")

最佳答案

这里有一个更简单的方法,使用 structmemoryview用几行代码读取和写入数据:

import struct
from PyQt5 import QtCore

shared_mem = QtCore.QSharedMemory()
shared_mem.setNativeKey("test")
shared_mem.create(4*6)
shared_mem.attach()

memtocopy = [0,1,2,3,4,5]

try:

# Fill in
shared_mem.lock()
shared_mem.data()[:] = memoryview(struct.pack('=6i', *memtocopy))
shared_mem.unlock()

# Read out
shared_mem.lock()
# python3
k = memoryview(shared_mem.data()).cast('i')
# python2
# k = struct.unpack('=6i', memoryview(shared_mem.data()))
shared_mem.unlock()

if k[3] == memtocopy[3]:
print("success!")
else:
print("fail!")

finally:

shared_mem.detach()

关于将列表从 QSharedMemory 复制到 sip.voidptr 的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51169641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com