Межмодульные зависимости в Boost Python - PullRequest
7 голосов
/ 14 декабря 2010

Предположим, у меня есть два буст-модуля Python, которые определены следующим образом.Модуль A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    class_<SomeClass>("SomeClass");
}

И модуль B:

class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

Модуль B зависит от модуля A (т.е. использует SomeClass от модуля A).Теперь я выполняю следующий скрипт Python:

import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\bladiebla\script.py", line 8, in <module>
    obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)

Кажется, что Python не выполняет автоматический перевод классов между модулями.У кого-нибудь есть идеи как это решить?

Ответы [ 2 ]

7 голосов
/ 23 августа 2011

Я недавно начал возиться с Boost.Python, и у меня возникла та же проблема.

Ознакомьтесь с разделом 6 следующего документа:

http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html

6.1 -Динамический двоичный файл

Библиотека содержит реестр преобразования типов. Поскольку один реестр является общим для всех модулей расширения, экземпляры класса, предоставляемые Python в одном динамически загружаемом модуле расширения, могут передаваться функциям, предоставляемым в другом таком модуле .

Я использовалстатический двоичный файл и получил тот же тип ошибки, что и вы.Как только я перешел на динамический двоичный файл, он скомпилировался и работал нормально.

0 голосов
/ 14 декабря 2010

Исходя из вашего последнего ответа и обновленного сообщения об ошибке в вашем вопросе, я думаю, что проблема может быть в том, что ваше BOOST_PYTHON_MODULE использование может быть неправильным (на основании того, что я видел в других примерах его использования).Попробуйте что-то вроде этого и посмотрите, поможет ли это:

Модуль A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    boost::python::class_<SomeClass>("SomeClass");
}

И модуль B:

class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   boost::python::class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

Обратите внимание на вставку "boost::python::"префикс к оператору class_<...> в каждом из двух объявлений BOOST_PYTHON_MODULE.

...