Как вызвать конструкторы vala из python? (используя самоанализ GObject)

Я хочу иметь общую библиотеку, написанную на 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 (без параметров в конструкторе) работает, но оператор печати в конструкторе Foo (код Vala) не выполняется.

Когда я хочу создать объект типа Bar, я должен опустить строку в конструкторе, иначе Python жалуется на то, что конструктор не принимает аргумент (хотя он должен его принимать!)

В остальном оба объекта работают так, как должны. Вызов метода объектов (оба объекта) с аргументом работает и печатает все правильно.

Может ли кто-нибудь сказать мне, что я сделал неправильно?
Мне кажется невозможным вызвать любой тип конструктора Vala из Python.
Объекты создаются, но код конструктора не вызывается.


person Ansgar    schedule 19.04.2014    source источник


Ответы (1)


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

Или, если хотите, вы можете использовать конструкцию в стиле GObject в своем Код Вала.

person nemequ    schedule 19.04.2014