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

Swig安装

1、swig下载

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

Python代码转C python代码转c++代码工具_python

2、配置环境变量

在系统变量的Path路径中新建一个swig的环境变量

Python代码转C python代码转c++代码工具_python_02

3、测试

打开cmd命令行,输入swig --help,出现如下内容说明你已经安装成功

Python代码转C python代码转c++代码工具_Python代码转C_03

封装C/C++代码

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

1、编写C/C++代码

这是已经写好的计算多边形IOU的C++代码polyiou.cpp

Python代码转C python代码转c++代码工具_c#_04


头文件polyiou.h

Python代码转C python代码转c++代码工具_python_05


swig模块定义文件polyiou.i

Python代码转C python代码转c++代码工具_cmd命令_06

打开cmd命令行,进入C/C++代码所在文件夹,输入命令:

swig -python -c++ polyiou.i

Python代码转C python代码转c++代码工具_c++_07


然后文件下就会多出来两个不同的文件:polyiou_wrap.cxx(如果用c源码是example_wrap.c),和python文件polyiou.py。

Python代码转C python代码转c++代码工具_python_08

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

python自带一个distutils工具,可以用它来创建python的扩展模块。首先定义一个配置文件,命名为setup.py,如下所示:(注:swig生成的扩展模块对象名必须使用python模块名并在前面加上下划线_,刚才我们通过swig生成的python文件是polyiou.py,所以这里的模块对象名必须是’_polyiou’,否则无法顺利编译。)

Python代码转C python代码转c++代码工具_Python代码转C_09


在cmd命令行中继续输入:python setup.py build_ext --inplace

(这时候可能出现一个错误,主要是由于cpp文件的格式不正确所导致的)

Python代码转C python代码转c++代码工具_cmd命令_10


解决方法很简单(可以参考第一个链接中的解决方案):将polyiou.cpp文件修改为UTF-8 带BOM格式即可。没有Nodepad++编译器的可以使用vs转换编码方式。找到扩展 -> 管理扩展 -> 联机 -> 搜索UTF-8,找到Fix File Encoding工具下载安装即可

Python代码转C python代码转c++代码工具_Python代码转C_11


点击高级保存选项,找到带签名的UTF-8格式保存(如果没有高级保存选项按钮,可以在工具->自定义->命令里面添加)再次输入python setup.py build_ext --inplace

Python代码转C python代码转c++代码工具_cmd命令_12


完成之后会多出一个pyd文件和一个build文件夹:

Python代码转C python代码转c++代码工具_cmd命令_13

附录

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

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