使用pickle将Array [Byte]从ironpython传递给python

时间:2015-11-18 11:15:03

标签: python clr ironpython pickle

我最近开始为显微镜编程宏,该显微镜由Zeiss的ZEN Blue控制。 Zeiss宏环境使用IronPython 2.7.2.1。我需要写出一个hdf5文件,但不幸的是,对IronPython的hdf5支持非常糟糕。

我要传输的数据是Array [Byte]类型,它似乎以某种方式连接到.NET的CLR:

print "length: %i type: %s" %(len(data), type(data))

给出:

length: 4915200 type: <type 'Array[Byte]'>

我可以通过套接字连接(建议here)使用pickle将包含int和Strings的dict成功转移到python服务器。但是,当我尝试取消Array[Byte]数据的取消时,python想要导入CLR,当然这会失败:

ImportError: No module named clr

问题:将.NET数组[字节]转换为未链接到.NET clr的基本python类型/对象的最佳(最快)方法是什么?

非常感谢, 星

1 个答案:

答案 0 :(得分:0)

经过一些测试,我找到的最有效的解决方案是这样的:

首先,将Array [Byte]转换为python字符串:

data_str = str(buffer(data))

我不完全确定buffer的作用,但似乎有必要进行有效的计算,一些解释here

然后发送到cpython(在我的情况下通过套接字,cpython在linux机器上运行)并转换为元组:

#data_str is an RGB image with dims sx and sy
format_str = str(sx*sy*3).strip() + 'B' 
im_data = struct.unpack(format_str, data_str) #conversion to tuple

最后,使用numpyh5py撰写.h5文件:

#put into np.array
im = np.asarray(im_data, dtype=np.uint8) #this is the most Time consuming part
newshape = (3, sx, sy)
im = np.reshape(im, newshape, order='F')

#write out
f = h5py.File('zenimage_bgr24.h5', 'w')
f.create_dataset('/im', data = im, dtype='uint8')
f.close()