- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有一种方法可以用字典初始化结构:
fooData= {'y': 1, 'x': 2}
fooStruct = ffi.new("foo_t*", fooData)
fooBuffer = ffi.buffer(fooStruct)
是否有现成的函数来进行转换?
fooStruct = ffi.new("foo_t*")
(ffi.buffer(fooStruct))[:] = fooBuffer
fooData= convert_to_python( fooStruct[0] )
我必须自己使用 ffi.typeof("foo_t").fields 吗?
到目前为止我想出了这段代码:
def __convert_struct_field( s, fields ):
for field,fieldtype in fields:
if fieldtype.type.kind == 'primitive':
yield (field,getattr( s, field ))
else:
yield (field, convert_to_python( getattr( s, field ) ))
def convert_to_python(s):
type=ffi.typeof(s)
if type.kind == 'struct':
return dict(__convert_struct_field( s, type.fields ) )
elif type.kind == 'array':
if type.item.kind == 'primitive':
return [ s[i] for i in range(type.length) ]
else:
return [ convert_to_python(s[i]) for i in range(type.length) ]
elif type.kind == 'primitive':
return int(s)
有没有更快的方法?
最佳答案
Arpegius 的解决方案对我来说效果很好,而且非常优雅。我根据 Selso 使用 inspect 的建议实现了一个解决方案。 dir() 可以代替 inspect。
from inspect import getmembers
from cffi import FFI
ffi = FFI()
from pprint import pprint
def cdata_dict(cd):
if isinstance(cd, ffi.CData):
try:
return ffi.string(cd)
except TypeError:
try:
return [cdata_dict(x) for x in cd]
except TypeError:
return {k: cdata_dict(v) for k, v in getmembers(cd)}
else:
return cd
foo = ffi.new("""
struct Foo {
char name[6];
struct {
int a, b[3];
} item;
} *""",{
'name': b"Foo",
'item': {'a': 3, 'b': [1, 2, 3]}
})
pprint(cdata_dict(foo))
输出:
{'item': {'a': 3, 'b': [1, 2, 3]}, 'name': b'Foo'}
关于Python CFFI 将结构转换为字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444546/
好的,我尝试了这种从外国翻译过来的方法,它确实有效我在我的库中的 structs.lisp 文件中定义了这些,它在我所有其他依赖项之前首先加载 (cffi:defcstruct (cv-size :c
我正在尝试使用来自 SBCL 的 BLAS/LAPACK 库(特别是试图让 LLA 包运行)。我在加载 BLAS 共享库时遇到了很多麻烦;最终我发现它无法加载其依赖库。最终我能够通过手动加载它的所有依
有一种方法可以用字典初始化结构: fooData= {'y': 1, 'x': 2} fooStruct = ffi.new("foo_t*", fooData) fooBuffer = ffi.bu
我想使用 stat(2)来自 Common Lisp。 我已经定义了 stat 函数使用的结构: (cffi:defctype mode_t :unsigned-int) (cffi:defctype
在普通的 lisp 中,是否有推荐的外来类型的命名约定? (和一般类型)?例如: (cffi:defctype glyph-index-t :uint32) (cffi:defcstruct Poin
假设我在 cffi 下定义了一个枚举: from cffi import FFI ffi = FFI() ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEAR
IplImage struct documentation描述了 IplROI* roi 槽,它似乎是指向核心 types_c.h 头文件中定义的 IplROI struct 的指针: typede
我使用 cffi 模块来包装一个简单的 C 代码。问题是,我需要添加一个标志以使其编译 (std=c99)。目前我有类似的东西: from cffi import FFI ffibuilder = F
这是一个 C 语言的函数: union Example { int number; void *pointer; }; void return_a_value (union Examp
我是 Common Lisp 的新手,并对其进行了一些实验。我正在努力获得对 Windows 剪贴板的一些访问权限,然后我找到了这个引用: https://groups.google.com/foru
我实际上正在编写一个带有 cffi 模块的 python 程序来测试我的 C/ASM 库,我设法让它工作。但我不知道如何访问字符串中间字符的地址以将其传递给我的 lib 函数。例如: def my_b
我的最终目标是编译系统 FLEXI-TRIVIAL-DIRED ( http://common-lisp.net/project/ftd/ ),但我遇到了麻烦,因为我在任何地方都找不到所需的软件包之一
如果我使用 cffi.FFI.new 创建一个新结构,如何将其传递给具有相同结构定义的不同 FFI 中的函数? 我有一个基本的 C 结构,我通过 cffi 包在 Python 中使用它,我想将其传递给
我正在尝试使用 pip3 在 fedora23 工作站上安装 cffi。但我收到以下错误。 pip3 install cffi Collecting cffi Using cached cffi-
我想使用 cffi(如果必须,甚至使用 ctypes)从 Linux 上的 Python 3 访问 C ABI。该 API 由许多 .so 文件实现(我们称它们为 libA.so、libB.so 和
我想公开一个对象的缓冲区协议(protocol),就像in this example Cython 文档,但是我需要使用 CFFI 来执行此操作而且我找不到任何公开缓冲区协议(protocol)的示例
我正在学习如何将用 C 编写的代码包含到 Python 中,因为我有一个用于 Microchip 设备的 API,这对于我希望通过为其添加一个 Python 包装器来让我将来的生活更轻松,这将使我能够
我的C++代码是 StructureEx* obj; // structure functionEx((void**)&obj); 我的职能是 int functionEx(void** obj);
尝试在我的 linux 机器上的 python 3.4.3 上安装 cffi-1.7.0 源代码。出现以下错误。 $ python setup.py 安装 cc1:错误:无法识别的命令行选项“-Wno
我有一些 C 库,我想使用 CFFI 在 Python 中访问。构建库后,我得到了 2 个文件:$HOME/libcint/include/cint.h 和 $HOME/libcint/lib/lib
我是一名优秀的程序员,十分优秀!