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 コンストラクターを呼び出すことは不可能に思えます。
オブジェクトは作成されますが、コンストラクター コードは呼び出されません。