2010-12-14 17 views
6

Supponiamo di avere due moduli boost python definiti come segue. Modulo A:Dipendenze del modulo incrociato in Boost Python

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

And modulo B:

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

modulo B ha una dipendenza modulo A (cioè usa SomeClass dal modulo A). Ora, eseguo il seguente script python:

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

ottengo il seguente errore:

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) 

Sembra che Python non si traduce automaticamente le classi tra i moduli. Qualcuno ha un'idea di come risolvere questo?

risposta

0

In base alla risposta più recente e al messaggio di errore aggiornato nella tua domanda, il problema potrebbe essere dovuto al fatto che l'utilizzo di BOOST_PYTHON_MODULE potrebbe non essere corretto (in base a ciò che ho visto in altri esempi di utilizzo). Provare qualcosa di simile e vedere se aiuta:

Modulo A:

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

e il modulo B:

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

nota l'inserimento di un prefisso "boost::python::" sul class_<...> dichiarazione in ogni delle due dichiarazioni BOOST_PYTHON_MODULE.

+0

Ciao, grazie mille per il tuo feedback. Tuttavia, vorrei risolvere questo problema per due classi che non hanno una relazione di ereditarietà. Ad esempio, puoi immaginare che "SomeClass" sia in realtà un "Triangolo" di classe e che "AnotherClass" sia la classe "Poligono". Sicuramente non voglio che Polygon erediti da Triangle, perché non ha senso da un punto di vista OO. Quindi, come posso avere due classi in moduli diversi che non ereditano l'una dall'altra, ma che si usano a vicenda attraverso Python, come nel mio esempio originale? – Arjan

+0

'func()' vuole un argomento 'SomeClass'. Se vuoi passare qualcosa di diverso, come 'AnotherClass', puoi farlo ** senza ** facendo' AnotherClass' ereditato da 'SomeClass' aggiungendo un costruttore a' SomeClass' che accetta un 'AnotherClass' come argomento. In alternativa, è possibile scrivere qualcosa che accetta un argomento 'AnotherClass' e restituisce un'istanza' SomeClass', ma dovrebbe chiamarla esplicitamente.Se non puoi fare una cosa del genere, allora penso che tu sia bloccato - cosa dovrebbe fare comunque 'func()', se passi qualche classe arbitraria di cui non sa nulla? – martineau

+0

Sì, lo capisco, ma non voglio passare nulla di diverso a questa funzione, solo un argomento di tipo SomeClass. Nell'esempio dello script python, il mio obj1 è di tipo A.SomeClass. Non è correlato a B.AnotherClass. 'func' in B.AnotherClass dovrebbe accettare parametri di tipo A.SomeClass, come obj1. – Arjan

6

Ho appena iniziato a giocherellare con Boost.Python e ho avuto lo stesso problema.

Partenza sezione 6 del seguente documento:

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

6,1 - La dinamica binario

La biblioteca contiene un registro tipo di conversione. Poiché un registro è condiviso tra tutti i moduli di estensione, le istanze di una classe esposta a Python in un modulo di estensione caricato in modo dinamico possono essere passate a funzioni esposte in un altro modulo.

Stavo usando il binario statico e ho ottenuto lo stesso tipo di errore che stavi ottenendo. Una volta passato al binario dinamico, è stato compilato e funzionato correttamente.

Problemi correlati