numpy - PEP 3118警告当使用 ctypes array 作为numpy array

  显示原文与译文双语对照的内容
0 0

尝试将 ctypes array 用作 numpy array 时,出现以下警告消息:


Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type"help","copyright","credits" or"license" for more information.
>>> import ctypes, numpy
>>> TenByteBuffer = ctypes.c_ubyte * 10
>>> a = TenByteBuffer()
>>> b = numpy.ctypeslib.as_array(a)
C:Python27libsite-packagesnumpyctypeslib.py:402: RuntimeWarning: Item size
computed from the PEP 3118 buffer format string does not match the actual item s
ize.
 return array(obj, copy=False)
>>> b
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)

代码似乎正在工作,尽管。 忽略这里警告是个坏主意?

背景:我正在调用一个实时生成数据的C DLL 。 我需要通过一系列的缓冲区来保存数据。 在等待下一个缓冲区填充时,我想用numpy处理最近的缓冲区,并保存结果。 我正在用上面的代码生成缓冲区,似乎工作正常,但是我不想在地毯下面清理一个重要的问题。

时间: 原作者:

0 0

它是一个 Bug 在 python 中。 ctypes目前产生无效的PEP 3118类型代码,Numpy注意到: http://bugs.python.org/issue10746http://bugs.python.org/issue10744

当出现这种不一致的情况时,Numpy会跳过使用 PEP 3118缓冲区接口,并回退到旧的( 已经过时) 缓冲区接口。 这应该能正常工作。

你可以使用 python 模块的warnings 静默警告。 但是,警告可能会影响性能。

你还可以通过在 buffer() 中包装ctypes对象来解决这个问题。

原作者:
0 0

有一种更方便的方法,它完全避免了警告:

首先,不要首先将数据创建为 ctypes array,然后将它的转换为 NumPy array,然后将它作为一个 NumPy array,然后使用 numpy.ctypeslib.ndpointer 作为 ctypes Prototype中的类型说明符。 例如假设你有一个名为 f的C 函数,它采用 char*size_t 作为参数:


void f(char* buf, size_t len);

你的ctypes Prototype是


from numpy.ctypeslib import ndpointer
some_dll = ctypes.CDLL(...)
some_dll.f.argtypes = [ndpointer(numpy.uint8, flags="C_CONTIGUOUS"),
 ctypes.c_size_t]
some_dll.f.restype = None

你可以把这个函数称为


a = numpy.zeros(10, numpy.uint8)
f(a, a.size)

原作者:
...