Как мне вызвать конструкторы vala из python? (используя 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.
Я сгенерировал файл .typelib из файла .gir.
Затем я написал небольшое приложение на Python, которое должно использовать эту библиотеку.
Перед выполнением я должен был установить две переменные окружения, чтобы python знал, где найти библиотеку типов и библиотечный файл.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 (без параметра в конструкторе) работает, но оператор print в конструкторе Foo (код Vala) не выполняется.
Когда я хочу создать объект типа Bar, я должен опустить строку в конструкторе, иначе Python жалуется на то, что конструктор не принимает аргумент (даже если он должен принимать один!)
Кроме этого, оба объекта работают как надо. Вызов метода объектов (обоих объектов) с аргументом работает и печатает все правильно.
Может кто-нибудь сказать мне, что я сделал не так?
Мне кажется невозможным вызвать любой тип конструктора Vala из Python.
Объекты создаются, но код конструктора не вызывается.
1 ответ
https://wiki.gnome.org/action/show/Projects/PyGObject/IntrospectionPorting
Или, если хотите, вы можете использовать конструкцию в стиле GObject в своем коде Vala.