Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用SWIG don'包装共享指针对象;不允许访问类成员函数 我有一个C++摄像头,管理相机对象列表。 相机对象由std::list作为共享指针进行管理,即每个列表项的类型为:shared_ptr_Python_C++_Shared Ptr_Swig - Fatal编程技术网

Python 使用SWIG don'包装共享指针对象;不允许访问类成员函数 我有一个C++摄像头,管理相机对象列表。 相机对象由std::list作为共享指针进行管理,即每个列表项的类型为:shared_ptr

Python 使用SWIG don'包装共享指针对象;不允许访问类成员函数 我有一个C++摄像头,管理相机对象列表。 相机对象由std::list作为共享指针进行管理,即每个列表项的类型为:shared_ptr,python,c++,shared-ptr,swig,Python,C++,Shared Ptr,Swig,我可以从CameraManager对象获取相机,如下所示: std::shared_ptr<Camera> c = cameraManager.getCamera(); 但是,上面的CameraPython对象不允许我访问任何camera类函数。Python说是一个类型为“Swig object of type”std::shared_ptr*”的对象,位于#### 在Swig接口文件中添加以下内容 %include <std_shared_ptr.i> %share

我可以从CameraManager对象获取相机,如下所示:

 std::shared_ptr<Camera> c = cameraManager.getCamera();
但是,上面的CameraPython对象不允许我访问任何camera类函数。Python说是一个类型为“Swig object of type”std::shared_ptr*”的对象,位于####

在Swig接口文件中添加以下内容

%include <std_shared_ptr.i>
%shared_ptr(Camera)
不要更改生成的Python模块中的行为。你知道可能会遗漏什么吗

其他信息: C++代码使用了一个TyPoFi:< /P>
typedef CameraSP std::shared_ptr<Camera>;
代码是使用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和共享指针的使用。它是一个第三方库,拥有自己的共享ptr实现。通过名称空间名称解决共享指针修复了问题,生成的Python模块开始按预期工作。

上面的问题是处理Allied Vision的C/C++API,控制他们的摄像头。他们定义了自己的共享指针类,并使用与std共享指针类相同的名称命名它,即shared_ptr

此API的客户机代码使用std::shared_ptr,在某些情况下,使用shared_ptr而不指定名称空间会导致上述Swig问题。
通过在使用共享\u ptr时显式指定std名称空间,问题得到了解决,使用共享指针生成的swiged对象开始工作得非常好。

您是否打算执行
%的操作,包括“aiCamera.h”
,或者?hoops,编辑文章。事实上,它是“%included”可以复制这个的最小完整示例是什么?如果你能证明这一点的话,我早就回答了,没有悬赏。柔印所说的……有一个复制问题的例子,要得到答案还有很长的路要走。我很乐意为解决问题提供悬赏。然而,在创建一个简短的示例时,发现了问题。第三方库有自己的shared_ptr实现,并且有一个using指令,导致两个共享指针类(名称相同(!)(shared_ptr),但名称空间不同)混合在一起。建筑时未看到任何警告。不知道如何处理这个帖子。也许把它写下来作为一个答案可以帮助其他人?
typedef CameraSP std::shared_ptr<Camera>;
class MVR_API MVRObject
{
public:
                                     MVRObject();
                                     MVRObject(const MVRObject& obj);
    virtual                         ~MVRObject();

};
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})