Привязки Python для библиотеки vala

Я пытаюсь создать привязки Python к библиотеке vala, используя следующий учебник IBM в качестве ссылки.

В моем исходном каталоге есть следующие два файла:

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
%%

и попробуйте собрать исходный код модуля python test_wrap.c, используя следующий код

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

Однако последняя команда завершается с ошибкой

$ ./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

Это ошибка в pygobject или что-то не так с моей настройкой? Как лучше всего вызвать код, написанный на vala, из python?

EDIT: Удаление дополнительной строки устранило текущую проблему, но теперь, когда я приступаю к сборке модуля Python, я столкнулся с другой проблемой. Добавление следующего файла C к двум существующим в каталоге:

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");
  }
}

и сборка со следующим скриптом

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()'

приводит к ошибке:

$ ./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

Где определяется символ init_pygobject? На что я пропустил ссылку?


person D R    schedule 10.06.2010    source источник
comment
Этот вопрос был задан несколько лет назад, и сейчас ситуация может измениться. Какова текущая ситуация?. т. е. как В НАСТОЯЩЕЕ ВРЕМЯ лучше всего генерировать привязки Python для кода vala?   -  person Homunculus Reticulli    schedule 08.05.2012


Ответы (3)


Вы можете использовать GObject Introspection.

Этот репозиторий содержит примеры автоматической привязки библиотек vala к другим языкам:

https://github.com/antono/vala-object

person antono    schedule 16.01.2012

Очень плохая ситуация! Написание привязок для pygtk — это настоящий ад, к счастью, они переключаются на самоанализ объектов, что облегчит задачу.

В любом случае кажется, что в файле test.override есть лишняя новая строка, попробуйте удалить ее, и она должна работать (по крайней мере, я проверял это)

person pygabriel    schedule 10.06.2010
comment
Спасибо. Это исправило текущую проблему, но теперь у меня есть новая. Вы знаете, как это решить? - person D R; 11.06.2010
comment
Извините, нет, я пытался где-то искать, но не нашел ничего подходящего, похоже, это работало с pygtk 2.16, вам следует обратиться в список рассылки pygtk. - person pygabriel; 11.06.2010

Похоже, этот код есть и во втором блоге Чарли, 2008 г.

test_module.c должен включать <pygobject.h>:

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

С этим изменением он строится и работает на python с помощью:

>>> import test
>>> t = test.Test()
>>> t.sum(1,2)
3
person hpaulj    schedule 19.08.2011