python3调用cpp的方法——python调用so
python中使用ctypes模块可以在python中直接调用C/C++。
首先要将C/C++编译成动态库(.so),之后python中调用即可
特别注意在调用C++函数需要在函数声明时,加入前缀“ extern “C” ”,这是由于C++支持函数重载功能,在编译时会更改函数名。在函数声明时,前缀extern "C"则确保按C的方式编译。
值得注意的是,一定要有函数输入输出类型的声明,int型不用转换,float和double类型需要进行转换,
ctypes中的变量类型与C中对应如下:
ctypes数据类型 | C数据类型 |
---|---|
c_char | char |
c_short | short |
c_int | int |
c_long | long |
c_float | float |
c_double | double |
c_void_p | void |
c_uint8 | unsigned char |
使用步骤:
1、编写c++代码
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <stdio.h>class Test{private:double _calculate(int a, double b);public:double calculate(int a, double b, char c[], int * d, double * e, char ** f);
};double Test::_calculate(int a, double b){double res = a+b;std::cout<<"res: "<<res<<std::endl;return res;
}double Test::calculate(int a, double b, char c[], int * d, double * e, char ** f){std::cout<<"a: "<<a<<std::endl;std::cout<<"b: "<<b<<std::endl;std::cout<<"c: "<<c<<std::endl;std::cout<<"d: "<<d[0]<<d[1]<<std::endl;std::cout<<"e: "<<e[0]<<e[1]<<std::endl;std::cout<<"f: "<<f[0]<<f[1]<<std::endl;return this->_calculate(a, b);
}// 封装C接口
extern "C"{
// 创建对象Test* test_new(){return new Test;}double my_calculate(Test* t, int a, double b, char c[], int * d, double * e, char ** f){return t->calculate(a, b,c,d,e,f);}
}
2、将cpp编译成so
g++ -shared -Wl,-soname,test -o test.so -fPIC test.cpp
其中test为cpp的名称
3、使用python调用即可
# -*- coding: utf-8 -*-
import ctypes
# 指定动态链接库
lib = ctypes.cdll.LoadLibrary('./test.so')
#需要指定返回值的类型,默认是int
lib.my_calculate.restype = ctypes.c_doubleclass Test(object):def __init__(self):# 动态链接对象self.obj = lib.test_new()def calculate(self, a, b,c,d,e,f):res = lib.my_calculate(self.obj, a, b,c,d,e,f)return res#将python类型转换成c类型,支持int, float,string的变量和数组的转换
def convert_type(input):ctypes_map = {int:ctypes.c_int,float:ctypes.c_double,str:ctypes.c_char_p}input_type = type(input)if input_type is list:length = len(input)if length==0:print("convert type failed...input is "+input)return nullelse:arr = (ctypes_map[type(input[0])] * length)()for i in range(length):arr[i] = bytes(input[i],encoding="utf-8") if (type(input[0]) is str) else input[i]return arrelse:if input_type in ctypes_map:return ctypes_map[input_type](bytes(input,encoding="utf-8") if type(input) is str else input)else:print("convert type failed...input is "+input)return nullif __name__ == '__main__':t = Test()A1 = 123;A2 = 0.789;A3 = "C789";A4 = [456,789];A5 = [0.123,0.456];A6 = ["A123", "B456"];print(t.calculate(convert_type(A1), convert_type(A2), convert_type(A3),convert_type(A4),convert_type(A5),convert_type(A6)))
python3调用cpp的方法——python调用so相关推荐
- python调用脚本_3种python调用其他脚本的方法
1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') ...
- python调用shell命令-用Python调用Shell命令
Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令. 用Python调用Shell命令有如 ...
- python调用linuxapi_Linux上使用python调用WPS二次开发接口
原文链接Linux上使用python调用WPS二次开发接口 - C++ Programerwww.cryfeifei.cn 环境Ubuntu18.04 WPS For Linux Python3 简 ...
- python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解
前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...
- itchat 调用微信网页版 python 调用微信
itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 当然,该api的使用远不止一个机器人,更多的功能等 ...
- c语言调用c 接口方法,C++调用C接口的实现示例
C++调用C代码 一个C语言文件p.c #include void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%d\n",a,b); ...
- python调用ironpython_从标准Python调用IronPython
如何在 Python中调用Iron Python函数?有没有一种简单的方法来连接这两者.我需要灵活的IronPython中不可用的全套Python库以及Python .net目前没有的最新CLR. 到 ...
- 调用接口的方法 java_java调用接口的方法
java调用接口的方法 发布时间:2020-06-24 10:42:58 来源:亿速云 阅读:85 作者:Leah 这期内容当中的小编将会给大家带来有关java调用接口的方法,以专业的角度为大家分析和 ...
- c 调用java post方法_C#调用Java方法(详细实例)
C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...
- java 调用对象的方法_JAVA调用对象方法的执行过程
JAVA调用对象方法的执行过程: ①.编译器查看对象的声明类型和方法名.假设调用x.f(parameter), 且隐式参数x声明为C类型的对象,有可能在C对象中存在多个参数类型和参数个数不同的f的方 ...
最新文章
- 2017-2-23 C#基础 中间变量
- 通用试题库管理系统 jsp mysql_通用在线考试系统 JSP+Servlet+MySQL
- 用于参考的学生信息管理系统(数据库简单 可自己参考创建)
- PKU2019暑期学堂 游记
- MySQL存储过程相互调用
- leetcode 377. 组合总和 Ⅳ(dp)
- linux打印jvm内存堆栈_jvm内存堆栈监控之jmap篇
- UVALive 6888 Ricochet Robots bfs
- 用 iOS-System-Services 框架获取iOS设备所用的设备信息
- shell手册--笨鸟杰作
- 最新计算机主板参数,电脑主板参数知识
- 基于Java实现一个简单的单词本Android App
- Drupal主题介绍
- 小米盒子2刷android tv,【二次搬运】小米盒子3S刷Android TV教程
- 【Matlab水果识别】形态学水果大小识别【含GUI源码 920期】
- Scapy:send函数剖析(参数、返回值、应用)
- 射频识别技术漫谈(4)——数据编码
- 2019利兹大学计算机排名,2019软科世界大学学术排名利兹大学排名第101-150
- 如何计算给定二叉树中的叶节点数?
- 快排两种实现及五种优化
热门文章
- 轻松搞定iOS自动化环境搭建
- 魔兽世界单机(芒果3.3.5a)机器人操作命令大全
- 网络安全——风险评估
- 虚拟机VMware破解版教程下载
- 也许你看了一本假的天龙八部
- python爬取淘宝数据魔方_淘宝数据魔方技术架构解析读后感
- Tungsten Fabric知识库丨更多组件内部探秘
- csharp基础练习题:过滤列表【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
- 密码显示隐藏符号格式会变
- QualDash: Adaptable Generation of Visualisation Dashboards for Healthcare Quality Improvement