使用 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()
。一个非常愚蠢的错误花了很多时间才弄明白。
我试图将 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()
。一个非常愚蠢的错误花了很多时间才弄明白。