Как мне вызвать конструкторы 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.

Другие вопросы по тегам