我有一个C ++ CameraManager类,该类管理Camera对象的列表。
相机对象由std :: list作为共享指针管理,即每个列表项的类型为:shared_ptr
我可以通过CameraManager对象获取Camera
std::shared_ptr<Camera> c = cameraManager.getCamera();
使用Swig创建Python模块,以上内容翻译为python代码:
camera = cameraManager.getCamera()
但是,上面的camera Python对象不允许我访问任何Camera类函数。 Python说的是一种类型的对象:####
处的'std :: shared_ptr *类型的Swig对象在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模块按预期开始工作。
答案 0 :(得分:1)
以上问题是与Allied Vision提供的C / C ++ API一起处理的,它们控制着摄像机。他们定义了自己的共享指针类,并使用与std共享指针类相同的名称命名它,即shared_ptr。
此API的客户端代码使用std :: shared_ptr,并且在某些时候使用了shared_ptr(未指定名称空间)导致上述Swig问题。 通过在使用shared_ptr时显式指定std名称空间,解决了问题,并且使用共享指针,得到的swigged对象开始正常工作。