【发布时间】:2018-07-04 08:55:25
【问题描述】:
我正在使用 PyQT5 和 QSharedMemory 类。我正在创建一个可以容纳 6 个 1 字节元素的共享内存。要将这些元素复制到共享内存数组中,我将循环遍历 python 列表中的元素,如下面的 sn-p:
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!")
【问题讨论】:
-
为什么不
k[:] = memtocopy? -
这将导致 TypeError: can only assign another array of unsigned char to the slice,我也编辑了问题以显示这种情况
-
那么这可能是弄清楚它想要什么数组类型的问题。我猜
ctypes,但也许它支持缓冲协议。 PyQt's documentation 没有帮助。 -
sip.voidptr.asarray是 4.16.5 版的新功能,这解释了为什么我在 Debian Jessie 中没有它。所以数组类型是sip.array,它也恰好只在现有的情况下被记录。 -
sip should support the buffer protocol,所以使用 Python
array.array或bytearray应该真的可以工作。整数列表不会。
标签: python pyqt pyqt5 qsharedmemory