最近在使用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++代码