最近需要用到Python下调用C++程序,看了很多博客记录下最实用的一种方法。
很多的方法,需要在编译C++程序的时候给出Python的库。因为在程序里引用了“Python.h”。这时,就需要用户能够准确的找到并给出对应版本的Python库的地址。然而,我相信也有很多人的计算机里安装了不止一个版本的Python,比如还有anaconda下的Python。因此,寻找并给出正确版本的Python库的地址是一件比较繁琐的事情。
同时,我们往往希望编译出的一个C++库,不同版本的Python都可以调用。但如果按照网上博客的很多方式,是无法实现这一点的。
此外,对于C++的编译,我们往往习惯于使用cmake工具,而这一点也是很多博客中没有给出的。
基于以上几点,本文给出一种自己探索出的,能解决上述问题的Python调用C++的方式。
tryPython.cpp
#include
tryPython.py
import
CMakeLists.txt
cmake_minimum_required
如果不想用CMake则编译命令为:
g++ -o libtryPython.so -shared -fPIC tryPython.cpp
使用的顺序为,
1、编辑"*.cpp“文件。注意因为是C++,所以extern“C”是必要的的。
2、编译cpp生成动态库。编译方法可以是直接上g++,也可以用CMake。
3、在Python中使用ctypes调用生成的库,从而完成调用C++程序。
然而,往往我们调用的目的是由于Python的运算速度慢,而C/C++的处理速度快一些。所以,我们往往会想要传递数组类型的参数。以下将分享在ctypes下,传递float、数组、指针型参数的方法。
需要强调的是,
1、还可以传递结构体类型的参数,不过本文没有介绍,在ctypes的官网有说明;
2、就我目前所知,基于ctypes所调用函数的返回值只能是ctypes定义过的类型(可在官网查看),诸如float类型的数组无法返回。
3、我依然没有找到基于ctypes,将numpy的array直接传递给C++为cv::Mat类型或是Eigen类型的方法。目前,我只能给出将数组reshape为一维数组后传参的方式。
请求大神有无知道解决2、3问题的解决方法?
以下是代码
tryCPython.cpp
#include
tryCPython.py
import
总结:觉得虽然ctypes实现Python调用c/c++已经是比较简单的实现方式了,可依然不是很理想。