У меня есть класс C ++ CameraManager, который управляет списком объектов Camera. Объекты камеры управляются как std :: list как общие указатели, то есть каждый элемент списка имеет тип: shared_ptr .
Я могу получить камеру из объекта CameraManager как
std::shared_ptr<Camera> c = cameraManager.getCamera();
При создании модуля Python с использованием Swig вышеприведенный код переводится в код Python следующим образом:
camera = cameraManager.getCamera()
Объект Python камеры выше, однако, не позволяет мне получать доступ к каким-либо функциям классов Camera. ,Python говорит, что это объект типа: 'Swig объект типа' std :: shared_ptr * 'в ####
Добавление следующего в файл интерфейса Swig
%include <std_shared_ptr.i>
%shared_ptr(Camera)
перед включением
%include "aiCamera.h"
не меняйте поведение в получающемся модуле Python. Любые идеи, которые могут отсутствовать?
Дополнительная информация: Код C ++ использует typedef:
typedef CameraSP std::shared_ptr<Camera>;
Класс Camera является производным от базового класса, который практически пуст.
class MVR_API MVRObject
{
public:
MVRObject();
MVRObject(const MVRObject& obj);
virtual ~MVRObject();
};
Код скомпилирован с использованием VS 2013 и CMake. Код CMake выглядит следующим образом:
set_source_files_properties(${PyModule}.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(${PyModule}.i PROPERTIES SWIG_FLAGS "-threads")
SWIG_ADD_LIBRARY(${PyModule}
TYPE MODULE
LANGUAGE python
SOURCES ${PyModule}.i
)
SWIG_LINK_LIBRARIES (${PyModule}
${PYTHON_LIB_FOLDER}/Python37.lib
dslFoundation
aimvr
)
# INSTALL PYTHON BINDINGS
# Get the python site packages directory by invoking python
execute_process(COMMAND python -c "import site; print(site.getsitepackages()[0])" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
message("PYTHON_SITE_PACKAGES = ${PYTHON_SITE_PACKAGES}")
SET(SWIG_RUNTIME ${CMAKE_CURRENT_BINARY_DIR}/mvr_swigpyrun.h)
execute_process(COMMAND ${SWIG_EXECUTABLE} -python -external-runtime ${SWIG_RUNTIME})
ОБНОВЛЕНИЕ: проблема была не в Swig, а в использовании общих указателей. Это была сторонняя библиотека, имеющая собственную реализацию shared_ptr. Устранение общих указателей по именам пространств имен устранило проблему, и полученный модуль Python начал работать, как и ожидалось.