Domanda

Supponiamo che io ho due moduli spinta python che sono definite come segue. Modulo A:

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

e il 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?

Nessuna soluzione corretta

Altri suggerimenti

Ho da poco iniziato a giocherellare con Boost.Python e aveva lo stesso problema.

Scopri la sezione 6 del seguente documento:

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

6.1 - La dinamica Binary

La biblioteca contiene un registro tipo di conversione. Perché un registro è condivisa tra tutti i moduli di estensione, istanze di una classe esposto a Python in un modulo di estensione dinamicamente loaded possono essere passati a funzioni esposte in un altro tale modulo .

Stavo usando il binario statico e ottenuto lo stesso tipo di errore si stavano diventando. Una volta ho cambiato il binario dinamico, compilato e ha funzionato benissimo.

In base alla tua ultima risposta e messaggio di errore aggiornato nella tua domanda, penso che il problema potrebbe essere dovuto al fatto che l'uso BOOST_PYTHON_MODULE potrebbe non essere corretto (in base a quello 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)
    ;
}

Si noti l'inserimento di un prefisso "boost::python::" sulla dichiarazione class_<...> in ciascuna delle due dichiarazioni BOOST_PYTHON_MODULE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top