Вопрос

Предположим, у меня есть два модуля Boost 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 из модуля а). Теперь я выполняю следующий скрипт 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 не автоматически переводит классы между модулями. У кого -нибудь есть идея, как это решить?

Нет правильного решения

Другие советы

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

Проверьте раздел 6 следующего DOC:

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

6.1 - Динамический бинарный

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

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

На основании вашего последнего ответа и обновленного сообщения об ошибке в вашем вопросе, я думаю, что проблема может быть потому, что ваша 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 декларации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top