我正在为Rhythmbox编写一个插件,其中signal raised正在传递一个GArray
类型的对象。GLib Arrays的文档显示了一些我感兴趣但无法访问的方法。在
例如,g_array_index可以给我一个阁楼里的第n个物品,但我无法调用它。GArray对象也没有显示任何有用的方法。在
要了解我的意思,请在Python控制台中执行以下操作:
from gi.repository.GLib import Array
x = Array()
dir(x)
这是dir(x)的输出
^{pr2}$我没有看到从数组中读取的方法,也没有看到关于g_array_index
或GLib数组文档页面中提到的任何其他方法。我也试过了
for a in x:
print a
还有
list(x)
但我收到一个错误:
TypeError: 'Array' object is not iterable
尝试x[0]会得到以下结果:
TypeError: 'Array' object does not support indexing
len
属性提供了预期的数组长度。在
data
属性给出了这一点
我该怎么处理这个油嘴滑舌的数组我被淘汰了?在
我运行的是python2.7.4
GArray
没有正确地注释/导出,因此它没有像您预期的那样映射到Python对象。事实上,您可以在最后用C代码片段检查输出的内容以及Python模块将看到的内容。在如您所见,只导出了两个字段(
len
和data
)。所以,回答您的问题:到目前为止,您还不能真正使用Python中的GLib.Array
。在代码如下:
^{pr2}$简介
在这个答案中,我将尝试总结我在这个问题上所学到的知识,并提供一个解决方案来解决这个问题出现的一些情况。不幸的是,在某些情况下,似乎没有现成的解决方案,尽管我认为可以修改pythongi模块以启用解决方案(请参见下面结束思想)。在
背景
核心问题是}的一个非常薄的包装。除此之外,它还添加了一些特性,比如ref计数和对零终止的内置支持。但是,它缺少的一个显著特性是对数组元素类型的任何了解!这意味着Python GI(GObject Introspection)模块无法调整任意的}包含什么的进一步信息。在
GArray
只是malloc()
、realloc()
和{GArray
作为Python序列类型,而没有关于{官方方法
使用gi模块支持的
GArray
s的方法是生成一个.typelib文件,其中包含它需要的附加信息,以便适应每个特定的GArray
实例。幸运的是,有一个工具链可以帮助您直接从源代码生成这些文件。在要使用此方法,请首先根据此处定义的格式用注释块记录源代码:
接下来,运行g-ir-scanner工具,以生成一个.gir文件。此工具的文档可在以下位置找到:
最后,可以使用g-ir-compiler工具创建.typelib文件。记录如下:
此过程的详细介绍如下:
下面是一个重点关注Javascript的例子:
我可以保证它是有效的。一旦生成了一个.typelib文件,提供了
GArray
的必要细节,gi模块将为其提供一个熟悉的序列样式接口,因此您可以像使用列表一样使用它。在解决办法
不幸的是,您不能做的是使用gi框架来公开在指定的garray下使用的函数,您可能会从其他api获得这些函数!如果您试图将这些
GArray
之一传递到函数中,Python会抱怨它不是序列类型。在在我的例子中,我正在编写一个GStreamer应用程序,其中一个特定的pipeline元素正在生成
GstMessage
,其中包含一对GArray
成员。虽然我无法编写访问器函数来直接读取这些成员的内容,但我发现我可以编写使用GstStructure
的函数,然后读取所需的成员并将其作为一个完全指定的GArray返回,gi可以将其调整为一个适当的Python序列。在参考文献
有关
GArray
的详细信息,请参阅:特别要注意的是,虽然garray.h将
GArray
定义为只包含data
和len
成员的结构,但是在garray.c中可以看到这个接口类型是由struct _GRealArray
支持的,它包含另外6个成员。在有关GObject自省框架和Python gi模块的更多信息,请参见:
结束语
最后,PyGObject可以为您不控制的库启用变通方法,就是将
data
成员公开为Pythonbytes
对象,长度等于GArray.len * GRealArray.elt_size
。在相关问题 更多 >
编程相关推荐