python指针参数_Python调用C++ 传数组指针参数

最近需要用到Python下调用C++程序,看了很多博客记录下最实用的一种方法。

很多的方法,需要在编译C++程序的时候给出Python的库。因为在程序里引用了“Python.h”。这时,就需要用户能够准确的找到并给出对应版本的Python库的地址。然而,我相信也有很多人的计算机里安装了不止一个版本的Python,比如还有anaconda下的Python。因此,寻找并给出正确版本的Python库的地址是一件比较繁琐的事情。

同时,我们往往希望编译出的一个C++库,不同版本的Python都可以调用。但如果按照网上博客的很多方式,是无法实现这一点的。

此外,对于C++的编译,我们往往习惯于使用cmake工具,而这一点也是很多博客中没有给出的。

基于以上几点,本文给出一种自己探索出的,能解决上述问题的Python调用C++的方式。

tryPython.cpp

#include

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n <= 1)

return 1;

else

return n * (n - 1);

}

extern "C"

int fact(int n)

{

TestFact t;

return t.fact(n);

}

tryPython.py

import ctypes

lib = ctypes.CDLL('./libtryPython.so')

lib.fact(4)

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)project(tryPython)#set(CMAKE_C_COMPILER "gcc")#set(CMAKE_CXX_COMPILER "g++")#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" )#include_directories("/usr/include/python2.7")#target_link_libraries("/usr/lib/python2.7")add_library(${PROJECT_NAME} SHARED tryPython.cpp)

如果不想用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

// 传整数返回整数int add_int(int n1, int n2)

{

return n1+n2;

}

// 传浮点数返回浮点数float add_float(float n1, float n2)

{

return n1+n2;

}

// 传浮点数矩阵返回浮点数float printIntArray(float input[])

{

return input[0]+input[1];

}

// 传整型数组指针返回整形int pointIntArray(int* input)

{

return input[0]+2;

}

int ptIntArray(int* input)

{

return input[0]+input[1];

}

// 传整型数组指针返回整形指针,无效int* pttIntArray(int* input)

{

input[0] = input[0] + input[1];

return input;

}

tryCPython.py

import ctypes

lib = ctypes.CDLL('./libtryPython.so')

res1 = lib.add_int(4,5)

print(res1)

#设置参数类型

n1 = ctypes.c_float(5.5)

n2 = ctypes.c_float(6.5)

lib.add_float.restype = ctypes.c_float

res2 = lib.add_float(n1,n2)

print(res2)

two = 2.2

#设置数组类型,注意下面的5好像无法换成变量表示,但是给数组赋值时可以用变量赋值

tenArry = ctypes.c_float * 5

ii = tenArry(1.1,two,3.3,4.4,5.5)

print(ii)

lib.printIntArray.restype = ctypes.c_float

res3 = lib.printIntArray(ii)

print(res3)

i = ctypes.c_int(42)

#设置指针类型

pi = ctypes.pointer(i)

res4 = lib.pointIntArray(pi)

print(res4)

print("ptif")

five = ctypes.c_int * 5

ifive = five(11, 22, 33, 44, 55)

print(ifive)

ptif = ctypes.pointer(ifive)

res5 = lib.ptIntArray(ptif)

print(res5)

lib.pttIntArray.restype = ctypes.pointer

res6 = lib.pttIntArray(ptif)

总结:觉得虽然ctypes实现Python调用c/c++已经是比较简单的实现方式了,可依然不是很理想。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值