最近在使用DOTA_devkit工具的时候,需要计算多边形之间的iou;为了增加计算速度,作者使用了C++编写的polyiou.cpp文件,然后通过python调用C++代码来实现相关操作。为了更加深入了解python语言如何调用C/C++代码,我又重新尝试了一遍整个过程,写了一个教程供大家参考学习。(仅针对Windows系统)

Swig安装

1、swig下载

swig:下载链接
Windows用户下载swigwin-4.0.2压缩包,然后将其解压放在你能找到的地方即可。
在这里插入图片描述

2、配置环境变量

在系统变量的Path路径中新建一个swig的环境变量
在这里插入图片描述

3、测试

打开cmd命令行,输入swig --help,出现如下内容说明你已经安装成功
在这里插入图片描述

封装C/C++代码

注意:整个过程最好将所有文件都放在一个文件夹下

1、编写C/C++代码

这是已经写好的计算多边形IOU的C++代码polyiou.cpp
在这里插入图片描述
头文件polyiou.h
在这里插入图片描述
swig模块定义文件polyiou.i
在这里插入图片描述

打开cmd命令行,进入C/C++代码所在文件夹,输入命令:
swig -python -c++ polyiou.i
在这里插入图片描述
然后文件下就会多出来两个不同的文件:polyiou_wrap.cxx(如果用c源码是example_wrap.c),和python文件polyiou.py。
在这里插入图片描述

2、使用python.distutils生成模块动态库

python自带一个distutils工具,可以用它来创建python的扩展模块。首先定义一个配置文件,命名为setup.py,如下所示:(注:swig生成的扩展模块对象名必须使用python模块名并在前面加上下划线_,刚才我们通过swig生成的python文件是polyiou.py,所以这里的模块对象名必须是’_polyiou’,否则无法顺利编译。)
在这里插入图片描述
在cmd命令行中继续输入:python setup.py build_ext --inplace
(这时候可能出现一个错误,主要是由于cpp文件的格式不正确所导致的)
在这里插入图片描述
解决方法很简单(可以参考第一个链接中的解决方案):将polyiou.cpp文件修改为UTF-8 带BOM格式即可。没有Nodepad++编译器的可以使用vs转换编码方式。找到扩展 -> 管理扩展 -> 联机 -> 搜索UTF-8,找到Fix File Encoding工具下载安装即可
在这里插入图片描述
点击高级保存选项,找到带签名的UTF-8格式保存(如果没有高级保存选项按钮,可以在工具->自定义->命令里面添加)

再次输入python setup.py build_ext --inplace
在这里插入图片描述
完成之后会多出一个pyd文件和一个build文件夹:
在这里插入图片描述

附录

整个过程还是非常简单的,如果你有任何问题,都可以在下方评论或者私信联系博主。

参考网址:
[1] swig安装
[2] SWIG实现python对c++封装
[3] 关于如何编写C/C++代码

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐