我希望有一个用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代码)中的print语句未执行。
当我想创建一个 Bar 类型的对象时,我必须省略构造函数中的字符串,否则Python会抱怨构造函数没有参数(即使它应该带一个!)< / p>
除此之外,两个对象都可以正常工作。使用参数调用objects方法(两个对象)可以正常工作并打印所有内容。
有人可以告诉我我做错了什么吗? 我似乎不可能从Python调用任何类型的Vala构造函数 创建对象但不调用构造函数代码。
答案 0 :(得分:2)