我使用的是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()
这看起来很不符合语法和样板代码。我想知道有没有更合适的方法来达到同样的结果?在
使用时
^{pr2}$或者:
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
一起使用,fromstring
在以后的版本中已重命名为frombytes
。在在Python3.4中,这是有效的:
^{pr2}$^{} 替换了
buffer
,但知道元素有4个字节大,因此需要额外的转换。在这里有一个使用struct和memoryview的更简单的方法,它使用两个一行程序读写数据 公司名称:
相关问题 更多 >
编程相关推荐