我有一个 C++ CameraManager 类,管理一组 Camera 对象。 Camera 对象由 std::list 管理,作为 shared pointers 存储,即每个列表项的类型为:shared_ptr < Camera > 。
可以通过 CameraManager 对象获取 Camera:
std::shared_ptr<Camera> c = cameraManager.getCamera();
使用Swig创建Python模块,以上内容将被翻译为Python代码如下:
camera = cameraManager.getCamera()
上述的Python相机对象并不允许我访问任何相机类函数。Python指出它是一种类型为:“Swig object of type 'std::shared_ptr*' at ####” 的对象。
在Swig接口文件中添加以下内容:
%include <std_shared_ptr.i>
%shared_ptr(Camera)
在包含之前
%include "aiCamera.h"
不要改变生成的Python模块中的行为。有什么想法可能会丢失?
附加信息: C++代码使用typedef:
typedef CameraSP std::shared_ptr<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模块按预期开始工作。