Python 2.7 Python2.7和Python3.4中带有MemoryView的_缓冲区中的C类型

Python 2.7 Python2.7和Python3.4中带有MemoryView的_缓冲区中的C类型,python-2.7,type-conversion,ctypes,python-3.4,memoryview,Python 2.7,Type Conversion,Ctypes,Python 3.4,Memoryview,我试图将数据从memoryview传递到ctypes数组,该数组在Python3.4中运行良好,但在Python2.7中运行不好 当我跑的时候 from ctypes import c_byte data = memoryview(b'012') array = c_byte * 3 array.from_buffer_copy(data) 我在Python 3.4中得到了,但在Python 2.7.6中得到了以下错误: Traceback (most recent call last):

我试图将数据从memoryview传递到ctypes数组,该数组在Python3.4中运行良好,但在Python2.7中运行不好

当我跑的时候

from ctypes import c_byte
data = memoryview(b'012')
array = c_byte * 3
array.from_buffer_copy(data)
我在Python 3.4中得到了
,但在Python 2.7.6中得到了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a readable buffer object

但我认为这会增加数据的一个副本,而且不美观,因此我正在寻找一个更好的解决方案(关于
tobytes
方法是否有效的任何评论也将受到欢迎)

从ctypes导入*
pyapi=PyDLL(“PythonAPI”,handle=PythonAPI.\u handle)
PyBUF_SIMPLE=0
PyBUF_可写=0x0001
PyBUF_格式=0x0004
PyBUF_ND=0x0008
PyBUF_步幅=0x0010 | PyBUF_ND
PyBUF_C_连续=0x0020 | PyBUF_步幅
PyBUF_F_连续=0x0040 | PyBUF_步幅
PyBUF_任意连续=0x0080 | PyBUF_步幅
PyBUF_间接=0x0100 | PyBUF_步幅
PyBUF_CONTIG_RO=PyBUF_ND
PyBUF_CONTIG=PyBUF_和| PyBUF_可写
平步前进
PyBUF_跨步=PyBUF_跨步| PyBUF_可写
PyBUF_记录_RO=PyBUF_步幅| PyBUF_格式
PyBUF_记录=PyBUF_步幅| PyBUF_格式| PyBUF_可写
PyBUF_FULL_RO=PyBUF_间接| PyBUF_格式
PyBUF_FULL=PyBUF_间接| PyBUF_格式| PyBUF_可写
Py_-ssize\u t=c_-ssize\u t
Py_-ssize\u t\u p=指针(Py_-ssize\u t)
类pybuffer(结构):
“”“Python 3缓冲区接口”“”
_字段=('buf',c_void_p),
('obj',c_void_p),#拥有的引用
('len',Py_ssize_t),
#itemsize是Py\u ssize\t,因此可以指向它
#在这个简单的例子中大步前进。
('itemsize',Py_ssize_t),
(“只读”,c_int),
('ndim',c_int),
(“格式”,c_char_p),
('shape',Py_-ssize_-t_-p),
(“跨步”,Py_-ssize_-t_-p),
(“次补偿”,Py_-ssize_-t_-p),
#静态存储的形状和步幅的
#一维缓冲区。
('smalltable',Py_ssize_t*2),
(“内部”,c_void_p))
def get_缓冲区(self,obj=None,flags=PyBUF_SIMPLE):
self.release_buffer()
结构。初始化(自)
如果obj不是无:
pyapi.PyObject_GetBuffer(obj、byref(self)、标志)
def make_release_buffer():
导入ctypes
PyBuffer_Release=pyapi.PyBuffer_Release
memset=ctypes.memset
byref=ctypes.byref
sizeof=ctypes.sizeof
def释放缓冲区(自身):
如果self.obj:
PyBuffer_释放(byref(self))
memset(byref(self)、0、sizeof(self))
返回释放缓冲区
__初始化=获取缓冲区
__del\uuuu=release\u buffer=make\u release\u buffer()
del make_release_缓冲区
@财产
定义为类型(自身):
如果self.obj和self.buf:
arr=(c_char*self.len).from_地址(self.buf)
如果self.readonly:
arr=类型(arr)。从缓冲区复制(arr)
其他:
obj=py_object.from_buffer(c_void_p(self.obj)).value
arr._obj=obj
返回arr
pyapi.PyObject_GetBuffer.argtypes=(py_对象,#obj
指针(pybuffer),#视图
c#int)#标志
pyapi.PyBuffer_Release.argtypes=指针(PyBuffer),#视图
__如果n.startswith('PyBUF'),则all_uu=[n表示列表中的n(globals())]
__所有\uuu0.append('pybuffer')
示例:

>数据=内存视图(b'012')
>>>buf=pybuffer(数据)
>>>buf.readonly
1.
>>>数组=基本类型
>>>数组[0]=“9”
>>>数据[0]
'0'
>>>数据=内存视图(bytearray(b'012'))
>>>buf=pybuffer(数据)
>>>buf.readonly
0
>>>数组=基本类型
>>>数组[0]=“9”
>>>数据[0]
'9'

2.x ctypes正在调用
PyObject\u AsReadBuffer
,它将查找旧的缓冲协议插槽
bf\u getreadbuffer
memoryview
类型未定义此项;它使用新的
bf_getbuffer
接口。
array.from_buffer_copy(data.tobytes())