2

我想要一个用 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 构造函数。
对象被创建,但没有调用构造函数代码。

4

1 回答 1

2

https://wiki.gnome.org/action/show/Projects/PyGObject/IntrospectionPorting#Constructors

或者,如果您愿意,可以在您的 Vala 代码中使用GObject 样式的构造。

于 2014-04-19T23:03:38.077 回答