使用 SWIG 包装共享指针对象不允许访问 class 成员函数
Wrapping shared pointer object with SWIG don't give access to class member functions
我有一个 C++ CameraManager class 用于管理 Camera 对象列表。
相机对象由 std::list 作为共享指针管理,即每个列表项的类型为:shared_ptr < Camera > .
我可以从 CameraManager 对象获取一个 Camera
std::shared_ptr<Camera> c = cameraManager.getCamera();
使用Swig创建一个Python模块,上面翻译成python代码为:
camera = cameraManager.getCamera()
上面的相机 Python 对象不允许我访问任何相机 classes 函数。 Python 说是一个类型的对象:'Swig 对象类型 '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 派生自基本 class,实际上是空的。
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 模块开始按预期工作。
上面的问题涉及 Allied Vision 的 C/C++ API,控制他们的相机。他们定义了自己的共享指针 class 并使用与标准共享指针 class 相同的名称命名它,即 shared_ptr。
此 API 的客户端代码正在使用 std::shared_ptr,并且在某些时候使用 shared_ptr,但未指定命名空间导致 Swig 出现上述问题。
通过在使用 shared_ptr 时显式指定 std 命名空间,问题得到解决,生成的 swigged 对象使用共享指针开始工作得很好。
我有一个 C++ CameraManager class 用于管理 Camera 对象列表。 相机对象由 std::list 作为共享指针管理,即每个列表项的类型为:shared_ptr < Camera > .
我可以从 CameraManager 对象获取一个 Camera
std::shared_ptr<Camera> c = cameraManager.getCamera();
使用Swig创建一个Python模块,上面翻译成python代码为:
camera = cameraManager.getCamera()
上面的相机 Python 对象不允许我访问任何相机 classes 函数。 Python 说是一个类型的对象:'Swig 对象类型 '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 派生自基本 class,实际上是空的。
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 模块开始按预期工作。
上面的问题涉及 Allied Vision 的 C/C++ API,控制他们的相机。他们定义了自己的共享指针 class 并使用与标准共享指针 class 相同的名称命名它,即 shared_ptr。
此 API 的客户端代码正在使用 std::shared_ptr,并且在某些时候使用 shared_ptr,但未指定命名空间导致 Swig 出现上述问题。 通过在使用 shared_ptr 时显式指定 std 命名空间,问题得到解决,生成的 swigged 对象使用共享指针开始工作得很好。