Pracuję nad stworzeniem interfejsu C ++ do Pythona dla API, gdzie nie mam uprawnień do modyfikowania znacznej części C ++ w celu uzyskania mojego interfejsu.
Wybrałem Boost :: Python do użycia jako mój mostek z C ++ do Pythona. "Zdefiniowałem następujące części mojego BOOST_PYTHON_MODULE:
Początek mojej części 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);
}
Z mojego tłumacza, moje użycie tego interfejsu jest następujące:
>>> 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*)
Oczywiście w zakresie "sandprogression" mamy prototyp tej funkcji, którą próbujemy użyć powyżej, definiuje się jako:
extern "C" void api_create_sand_c_side_from_cfg_file(const char* cfg_file_name);
Założę się, że pewne typy sąautomatycznie wymienialny między C ++ i Python, ale najwyraźniej tak nie jest. Przesyłam dokumentację doładowania, aby spróbować zrozumieć, jak po prostu jawnie skonfigurować mapowanie, ale nie mogę zrozumieć, jak to się stało .
Odpowiedzi:
0 dla odpowiedzi № 1sandman_lib.sandprogression.api_blah("path")
należy użyć zamiast sandman_lib.sandprogression().api_blah("path")
. Patrzeć na przykład na boost.org.