2010-06-10 27 views
2

J'essaie de créer des liaisons python à une bibliothèque vala en utilisant le IBM tutorial comme référence.Liaisons Python pour une bibliothèque vala

Ma première a les deux fichiers suivants:

test.vala

using GLib; 

namespace Test { 

    public class Test : Object { 
     public int sum(int x, int y) { 
      return x + y; 
     } 
    } 

} 

test.override

%% 
headers 
#include <Python.h> 
#include "pygobject.h" 
#include "test.h" 
%% 
modulename test 
%% 
import gobject.GObject as PyGObject_Type 
%% 
ignore-glob 
    *_get_type 
%% 

et essayer de construire la source de module python test_wrap.c en utilisant le code suivant

build.sh

#/usr/bin/env bash 

valac test.vala -CH test.h 
python /usr/share/pygobject/2.0/codegen/h2def.py test.h > test.defs 
pygobject-codegen-2.0 -o test.override -p test test.defs > test_wrap.c 

Cependant, la dernière commande échoue avec une erreur

$ ./build.sh 
Traceback (most recent call last): 
    File "/usr/share/pygobject/2.0/codegen/codegen.py", line 1720, in <module> 
    sys.exit(main(sys.argv)) 
    File "/usr/share/pygobject/2.0/codegen/codegen.py", line 1672, in main 
    o = override.Overrides(arg) 
    File "/usr/share/pygobject/2.0/codegen/override.py", line 52, in __init__ 
    self.handle_file(filename) 
    File "/usr/share/pygobject/2.0/codegen/override.py", line 84, in handle_file 
    self.__parse_override(buf, startline, filename) 
    File "/usr/share/pygobject/2.0/codegen/override.py", line 96, in __parse_override 
    command = words[0] 
IndexError: list index out of range 

Est-ce un bogue dans pygobject, ou quelque chose de mal avec ma configuration? Quel est le meilleur moyen d'appeler du code écrit en vala depuis python?

EDIT: Retrait de la ligne supplémentaire fixe le problème actuel, mais maintenant que je passe pour construire le module python, je suis face à un autre problème. Ajout du fichier C suivant à deux existantes dans le répertoire:

test_module.c

#include <Python.h> 

void test_register_classes (PyObject *d); 
extern PyMethodDef test_functions[]; 

DL_EXPORT(void) 
inittest(void) 
{ 
    PyObject *m, *d; 
    init_pygobject(); 
    m = Py_InitModule("test", test_functions); 
    d = PyModule_GetDict(m); 
    test_register_classes(d); 
    if (PyErr_Occurred()) { 
     Py_FatalError ("can't initialise module test"); 
    } 
} 

et construire avec le script suivant

build.sh

#/usr/bin/env bash 

valac test.vala -CH test.h 
python /usr/share/pygobject/2.0/codegen/h2def.py test.h > test.defs 
pygobject-codegen-2.0 -o test.override -p test test.defs > test_wrap.c 

CFLAGS="`pkg-config --cflags pygobject-2.0` -I/usr/include/python2.6/ -I." 
LDFLAGS="`pkg-config --libs pygobject-2.0`" 

gcc $CFLAGS -fPIC -c test.c 
gcc $CFLAGS -fPIC -c test_wrap.c 
gcc $CFLAGS -fPIC -c test_module.c 
gcc $LDFLAGS -shared test.o test_wrap.o test_module.o -o test.so 

python -c 'import test; exit()' 

entraîne une erreur:

$ ./build.sh 
***INFO*** The coverage of global functions is 100.00% (1/1) 
***INFO*** The coverage of methods is 100.00% (1/1) 
***INFO*** There are no declared virtual proxies. 
***INFO*** There are no declared virtual accessors. 
***INFO*** There are no declared interface proxies. 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ImportError: ./test.so: undefined symbol: init_pygobject 

Où le symbole init_pygobject est-il défini? Qu'est-ce que j'ai manqué de lier?

+0

Cette question a été posée il y a un certain nombre d'années et la situation peut avoir changé maintenant. Quelle est la situation actuelle?. c'est-à-dire ce qui est ** ACTUELLEMENT ** le meilleur moyen de générer des liaisons Python pour le code vala? –

Répondre

1

Très mauvaise situation! Écrire des liens pour pygtk est un sacré bonbon, heureusement ils passent à l'introspection de gobject qui rendra les choses plus faciles.

De toute façon, il semble qu'il y ait une nouvelle ligne supplémentaire dans le test.remplacer le fichier, essayez de supprimer cela et il devrait fonctionner (au moins je l'ai testé)

+0

Merci. Cela a résolu le problème actuel, mais maintenant j'en ai un nouveau. Savez-vous comment le résoudre? – dzhelil

+0

Je suis désolé non, j'ai essayé de chercher quelque part, mais je n'ai rien trouvé de pertinent, il semble que cela a fonctionné avec pygtk 2.16, vous devriez demander à la liste de diffusion pygtk. – pygabriel

1

On dirait que ce code est également Charlie's Second Blog 2008

test_module.c doit inclure <pygobject.h>:

#include <Python.h> 
#include <pygobject.h> 

Avec ce changement, il construit et fonctionne en python avec:

>>> import test 
>>> t = test.Test() 
>>> t.sum(1,2) 
3