我如何与油嘴滑舌的数组在Python中?

2024-09-21 05:50:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为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属性给出了这一点

enter image description here

我该怎么处理这个油嘴滑舌的数组我被淘汰了?在

我运行的是python2.7.4


Tags: 对象方法文档index属性objectdirnot
2条回答

GArray没有正确地注释/导出,因此它没有像您预期的那样映射到Python对象。事实上,您可以在最后用C代码片段检查输出的内容以及Python模块将看到的内容。在

info_type = 3 [3 == struct]
n_fields = 2, n_methods = 0

如您所见,只导出了两个字段(lendata)。所以,回答您的问题:到目前为止,您还不能真正使用Python中的GLib.Array。在

代码如下:

^{pr2}$

简介

在这个答案中,我将尝试总结我在这个问题上所学到的知识,并提供一个解决方案来解决这个问题出现的一些情况。不幸的是,在某些情况下,似乎没有现成的解决方案,尽管我认为可以修改pythongi模块以启用解决方案(请参见下面结束思想)。在

背景

核心问题是GArray只是malloc()realloc()和{}的一个非常薄的包装。除此之外,它还添加了一些特性,比如ref计数和对零终止的内置支持。但是,它缺少的一个显著特性是对数组元素类型的任何了解!这意味着Python GI(GObject Introspection)模块无法调整任意的GArray作为Python序列类型,而没有关于{}包含什么的进一步信息。在

官方方法

使用gi模块支持的GArrays的方法是生成一个.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定义为只包含datalen成员的结构,但是在garray.c中可以看到这个接口类型是由struct _GRealArray支持的,它包含另外6个成员。在

有关GObject自省框架和Python gi模块的更多信息,请参见:

结束语

最后,PyGObject可以为您不控制的库启用变通方法,就是将data成员公开为Pythonbytes对象,长度等于GArray.len * GRealArray.elt_size。在

相关问题 更多 >

    热门问题