如何从Python调用Vala构造函数?(使用GObject Introspection)
我想要创建一个用Vala写的共享库,然后让一个Python应用程序来调用它。
于是我创建了这个Vala库,里面有两个对象,每个对象都有一个函数。
唯一的区别是,Bar在构造函数里需要一个参数,而Foo则不需要。
using GLib;
namespace VLibrary {
public class Foo : GLib.Object {
public Foo() {
stdout.printf("VALA:\tcreating object...");
}
public void printThis(string x) {
stdout.printf("print from vala: " +x +"\n");
}
}
public class Bar : GLib.Object {
public Bar(string parameter) {
stdout.printf("vala object created (with parameter)");
}
public void printThis(string x) {
stdout.printf("print from vala: "+x+"\n");
}
}
}
然后我用valac把它编译成一个共享库(.so文件)。
valac还生成了一个.vapi文件和一个.gir文件。
我又从.gir文件生成了一个.typelib文件。
接着我写了一个小的Python应用程序,打算使用这个库。
在运行之前,我需要设置两个环境变量,让Python知道去哪里找typelib和库文件。
export LD_LIBRARY_PATH=.
export GI_TYPELIB_PATH=.
#!/usr/bin/env python
from gi.repository import VLibrary
# Works, but doesnt call the constructor
foo1 = VLibrary.Foo()
# Works
foo1.printThis("FOO !")
# Works, but doesnt call the constructor
bar1 = VLibrary.Bar()
# Works
bar1.printThis("BAR !")
# TypeError: GObject.__init__() takes exactly 0 arguments (1 given)
text = 'hello world'
bar2 = VLibrary.Bar(text)
bar3 = VLibrary.Bar('hello world')
创建Foo类型的对象(构造函数里没有参数)是可以的,但在Foo的构造函数里的打印语句(Vala代码)并没有被执行。
当我想创建Bar类型的对象时,如果在构造函数里加上字符串,Python就会报错,提示构造函数不接受参数(尽管它应该接受一个!)
除此之外,这两个对象的其他功能都正常。调用对象的方法(两个对象)并传入参数也能正常工作,并且打印出所有内容。
有人能告诉我我哪里做错了吗?
我觉得从Python调用Vala的构造函数似乎是不可能的。
对象是创建了,但构造函数里的代码没有被调用。