如何在Python中阅读LV2 ttl文件?

时间:2012-08-06 19:46:13

标签: python rdf

我有一个LV2插件,我想使用Python来提取其元数据 - 插件名称,描述,控制和音频端口列表以及每个端口的规格。

使用LADSPA时,指令很清楚,虽然在Python中有点难以实现:我只需要调用ladspa_descriptor()函数。现在使用LV2,有一个.ttl文件,访问简单但解析起来更复杂。

是否有任何python库可以简化这项工作?

2 个答案:

答案 0 :(得分:2)

LV2文档生成工具使用RDFLib。它可能是Python最流行的RDF接口,但不仅仅是解析Turtle。如果性能不是问题,这是一个很好的选择,但不幸的是真的慢。

如果您需要实际实例化和使用插件,您可能希望使用现有的LV2实现。正如史蒂夫所说,Lilv就是为了这个。它不限于任何静态默认位置,但会查看LV2_PATH中的所有位置。您可以在调用Lilv之前将此环境变量设置为您想要的任何内容,并且只会查看这些位置。或者,如果您希望一次只加载一个包,则有一个函数:lilv_world_load_bundle()。

Lilv中包含基于SWIG的Python绑定,但它们实际上不允许您处理数据。然而,有一个项目可以包含Lilv,允许使用scipy数组处理音频:http://pyslv2.sourceforge.net/(尽管名称它们确实是Lilv绑定而不是其前身SLV2的绑定)

也就是说,如果你只需要从Turtle文件中获取静态信息,那么涉及C库可能比它的价值更麻烦。使用标准数据文件的一大优势是易于使用现有工具。要获取插件上的端口数,您只需要计算与模式匹配的三元组数(插件,lv2:端口,*)。下面是一个示例Python脚本,它打印插件的端口数,给定要读取的文件和插件URI作为命令行参数:

#!/usr/bin/env python
import rdflib
import sys

lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#')

path = sys.argv[1]
plugin = rdflib.URIRef(sys.argv[2])

model = rdflib.ConjunctiveGraph()
model.parse(path, format='n3')

num_ports = 0
for i in model.triples(plugin, lv2.port, None]):
    num_ports += 1

print('%s has %u ports' % (plugin, num_ports))

答案 1 :(得分:1)

这是如何获得每个插件支持的端口数量:

w = lilv.World()
w.load_all()
for p in w.get_all_plugins():
    print p.get_name().as_string(), p.get_num_ports()

至少这是我在试图解决这个问题时得到的全部内容。