使用 Swig 将多个 类 包装成 Python 的 C++

Wrapping multiple classes together of C++ for Python with Swig

我试图将 7 类 的 c++ 与 swig 包装在一起,并将它们放在同一个库中。以下是我的接口文件,用于保存所有 类。

// File : quadedge.i to hold all the interface files together
%module quadedge
%include cell.i
%include list.i
%include face.i
%include edge.i
%include obj.i
%include array.i
%include vertex.i

每个接口文件 cell.i, list.i, ... 是接口文件

//file : list.i : interface file for list.hh
%module list

%{
#include "list.hh"
%}

%include list.hh

我使用了一个 disutil 文件 setup.py 来包装 类。

#setup.py file:
from setuptools import setup, Extension
setup(name='quadedge',
    version='0.1',
    ext_modules=[Extension('_quadedge', sources=['array.cc','edge.cc','list.cc','cell.cc','face.cc','obj.cc','vertex.cc', 'quadedge.i'],
                    swig_opts=['-c++'],
                    )],
    headers=['array.hh','edge.hh','list.hh','cell.hh','face.hh','obj.hh','vertex.hh',]
)

和运行

 python setup.py build_ext --inplace  

它 运行 很好,几乎没有警告,但库已创建。然后我尝试导入 quadedge 库。

>>>import quadedge as qd
>>>a = qd.vertex()  
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-e068e492f5b5> in <module>()
----> 1 a = qd.vertex()

AttributeError: 'module' object has no attribute 'vertex'  

我想我不太了解 SWIG 如何包装 类。我认为 quadedge 将成为主库,所有其他 类 作为该库的子 类。

dir(qd)的输出

['Cell',
 'CellFaceIterator',
 'CellFaceIterator_swigregister',
 'CellVertexIterator',
 'CellVertexIterator_swigregister',
 'Cell_kill',
 'Cell_make',
 'Cell_makeTetrahedron',
 'Cell_swigregister',
 'Edge',
 'Edge_kill',
 'Edge_make',
 'Edge_splice',
 'Edge_swigregister',
 'Face',
 'FaceEdgeIterator',
 'FaceEdgeIterator_swigregister',
 'Face_kill',
 'Face_make',
 'Face_swigregister',
 'Vertex',
 'VertexEdgeIterator',
 'VertexEdgeIterator_swigregister',
 'Vertex_kill',
 'Vertex_make',
 'Vertex_swigregister',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '_newclass',
 '_object',
 '_quadedge',
 '_swig_getattr',
 '_swig_getattr_nondynamic',
 '_swig_property',
 '_swig_repr',
 '_swig_setattr',
 '_swig_setattr_nondynamic',
 'objCloneCell',
 'objReadCell',
 'objWriteCell']

问题出在命令的大小写上。我在做 qd.vertex(),因为代码区分大小写,所以它应该是 qd.Vertex()。一个非常愚蠢的错误花了很多时间才弄明白。