Sto lavorando alla creazione di un'interfaccia C ++ in Python per un'API in cui non sono autorizzato a modificare una porzione significativa del C ++ per ottenere la mia interfaccia.
Ho scelto Boost :: Python da utilizzare come bridge da C ++ a python. Ho definito le seguenti parti del mio BOOST_PYTHON_MODULE:
Inizio della mia porzione C ++:
using namespace boost::python;
BOOST_PYTHON_MODULE(sandman_lib) {
class_<manblock::ManDriver>("ManDriver", init< ... >())
scope sandprogression = class_<SandProgression>("sandprogression");
def("api_create_sand_c_side_from_cfg_file", api_create_sand_c_side_from_cfg_file);
}
Dal mio interprete, il mio uso di questa interfaccia è il seguente:
>>> import sandman_lib
>>> SAND = sandman_lib.sand_progression()
>>> SAND
<sandman_lib.sandprogression object at 0x7ffff7eaa998>
>>> SAND.api_create_sand_c_side_from_cfg_file("path_to_my_config_file")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
sandprogression.api_create_sand_c_side_from_cfg_file(sandprogression, str)
did not match C++ signature:
api_create_sand_c_side_from_cfg_file(char const*)
Ovviamente, nell'ambito di "sandprogression", abbiamo il prototipo di questa funzione che stiamo cercando di usare sopra, è definito come:
extern "C" void api_create_sand_c_side_from_cfg_file(const char* cfg_file_name);
Avrei pensato che alcuni tipi fosseroconvertibile automaticamente tra C ++ e Python, ma a quanto pare non è questo il caso: mi sono riversato sulla documentazione di boost per cercare di capire come impostare semplicemente semplicemente la mappatura, ma non riesco a capire come è fatto .
risposte:
0 per risposta № 1sandman_lib.sandprogression.api_blah("path")
dovrebbe essere usato al posto di sandman_lib.sandprogression().api_blah("path")
. Guarda a esempio su boost.org.