Зависимости модуля в Boost Python
-
09-10-2019 - |
Вопрос
Предположим, у меня есть два модуля 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
декларации.