2014-04-19 7 views
2

파이썬 응용 프로그램에서 호출 한 Vala로 작성된 공유 라이브러리가 필요합니다.python에서 vala 생성자를 호출하는 방법은 무엇입니까? (GObject 내성 검사 사용)

그래서이 Vala 라이브러리는 하나의 함수로 된 두 개의 객체로 만들어졌습니다.
유일한 차이점은 은 생성자에서 인수를 취하는 반면 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"); 
     } 
    } 
} 

그리고 공유 (.so를) 라이브러리에 valac를 사용하여 그것을 컴파일.
Valac도 .vapi.gir 파일을 생성했습니다.
나는 .gir 파일에서 .typelib 파일을 생성했습니다.

그런 다음이 라이브러리를 사용해야하는 작은 파이썬 응용 프로그램을 작성했습니다.
실행하기 전에 파이썬이 typelib과 라이브러리 파일을 어디에서 찾을 수 있도록 두 개의 환경 변수를 설정해야했습니다. 유형 의 객체를 생성
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') 

(생성자의 매개 변수) 작동하지만 생성자 (발라 코드)에 인쇄 문은 실행되지 밤은. 나는 바을 입력 의 객체를 생성 할 때

나는 그렇지 않으면 파이썬은 생성자 인수 복용하지 뿌려 생성자에서 문자열을 생략 할 수 있습니다 (이 일을해야에도 불구하고!)를 다른

이 두 개체는 꼭 필요한대로 작동합니다. 인수를 사용하여 객체 메소드 (두 객체)를 호출하면 올바르게 작동합니다.

누군가 내가 잘못한 것을 말할 수 있습니까?
Python에서 Vala 생성자를 호출하는 것은 불가능한 것처럼 보입니다.
개체가 생성되었지만 생성자 코드가 호출되지 않습니다. 당신이 선호하는 경우에, 당신은 당신의 발라 코드에서 GObject-style construction을 사용할 수 있습니다

답변