2

Python アプリケーションによって呼び出される共有ライブラリを Vala で記述したいと考えています。

そこで、それぞれ 1 つの関数を持つ 2 つのオブジェクトを使用して、この 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 アプリケーションを作成しました。
実行する前に、typelib とライブラリ ファイルの場所を Python に知らせるために、2 つの環境変数を設定する必要がありました。
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 が文句を言います (引数を取るべきなのに!)

これ以外は、両方のオブジェクトが正常に機能します。引数を指定してオブジェクト メソッド (両方のオブジェクト) を呼び出すと機能し、すべてが正しく出力されます。

誰かが私が間違ったことを教えてもらえますか?
Python から任意のタイプの Vala コンストラクターを呼び出すことは不可能に思えます。
オブジェクトは作成されますが、コンストラクター コードは呼び出されません。

4

1 に答える 1

2

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

または、必要に応じて、Vala コードでGObject スタイルの構築を使用できます。

于 2014-04-19T23:03:38.077 に答える