如何通过Swig为Python类创建别名?

5 投票
1 回答
663 浏览
提问于 2025-04-16 09:08
a = Imagedouble("filename")

我创建了一个C++库,并成功使用swig让它可以通过Python访问。这个库里面大量使用了模板,每种模板类型都通过swig映射到自己的Python类,像这样:

%template(Imageint) Image<int>;
%template(Imagedouble) Image<double>;

不过,我其实希望Python能使用一个“默认”的模板,这样就可以直接实例化 Image<double>,而不需要每次都输入

a = Image("filename")

Swig的文档中提到:

不要在同一个作用域内多次使用 %template 指令来包装同一个模板实例化。这会导致错误。这个错误的原因是模板扩展会生成两个同名的类,造成符号表冲突。而且,只包装特定的实例化一次,可能会更高效,能减少代码膨胀的可能性。

为了避免符号表冲突,我在接口文件中尝试了

%rename(Image) Image<double>;
%template(Imageint) Image<int>;
%template(Imagedouble) Image<double>;

但是,swig却抱怨说Image被重新定义了。

请问有什么好的方法可以创建一个别名,让Image和Imagedouble都指向C++的 Image<double>?非常感谢你能提供的任何帮助。

-Josh

1 个回答

8

如果将来有人需要这个信息,以上所描述的做法是要在接口文件中添加以下内容:

%pythoncode %{
Image = Imagedouble
%}

我之前没有意识到可以在接口文件中写标准的Python代码。

撰写回答