2010-12-14 3 views
6

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

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

И модуль В:

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

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

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 автоматически не классы между модулями. Кто-нибудь есть идея, как это решить?

ответ

0

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

+0

Привет, большое спасибо за отзыв. Однако я хотел бы решить эту проблему для двух классов, которые не имеют отношения наследования. Например, вы можете себе представить, что «SomeClass» на самом деле представляет собой «Треугольник» класса, а «AnotherClass» - это класс «Polygon». Я определенно не хочу, чтобы Polygon наследовал от Triangle, потому что это не имеет смысла с точки зрения OO. Итак, как я могу иметь два класса в разных модулях, которые не наследуют друг от друга, но которые используют друг друга через Python, как в моем первоначальном примере? – Arjan

+0

'func()' хочет аргумент 'SomeClass'. Если вы хотите передать ему что-то другое, например 'AnotherClass', вы можете сделать это ** без ** создания' AnotherClass' наследования из 'SomeClass', добавив конструктор в' SomeClass', который принимает в качестве аргумента 'AnotherClass'. В качестве альтернативы вы можете просто написать что-то, что приняло аргумент «AnotherClass» и вернул экземпляр «SomeClass», но ему нужно было бы его явно называть.Если вы не можете сделать что-то подобное, я думаю, что вы застряли - что 'func()' должен делать в любом случае, если передан какой-то произвольный класс, о котором он ничего не знает? – martineau

+0

Да, я это понимаю, но я не хочу передавать ничего подобного этой функции, только аргумент типа SomeClass. В примере сценария python мой объект obj1 имеет тип A.SomeClass. Он не связан с B.AnotherClass. «func» в B.AnotherClass должен принимать параметры типа A.SomeClass, такие как obj1. – Arjan

6

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

Заканчивать раздел 6 следующего док:

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

6,1 - Динамический Binary

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

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