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相关推荐

  1. python调用脚本_3种python调用其他脚本的方法

    1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') ...

  2. python调用shell命令-用Python调用Shell命令

    Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令. 用Python调用Shell命令有如 ...

  3. python调用linuxapi_Linux上使用python调用WPS二次开发接口

    原文链接Linux上使用python调用WPS二次开发接口 - C++ Programer​www.cryfeifei.cn 环境Ubuntu18.04 WPS For Linux Python3 简 ...

  4. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  5. itchat 调用微信网页版 python 调用微信

    itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 当然,该api的使用远不止一个机器人,更多的功能等 ...

  6. c语言调用c 接口方法,C++调用C接口的实现示例

    C++调用C代码 一个C语言文件p.c #include void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%d\n",a,b); ...

  7. python调用ironpython_从标准Python调用IronPython

    如何在 Python中调用Iron Python函数?有没有一种简单的方法来连接这两者.我需要灵活的IronPython中不可用的全套Python库以及Python .net目前没有的最新CLR. 到 ...

  8. 调用接口的方法 java_java调用接口的方法

    java调用接口的方法 发布时间:2020-06-24 10:42:58 来源:亿速云 阅读:85 作者:Leah 这期内容当中的小编将会给大家带来有关java调用接口的方法,以专业的角度为大家分析和 ...

  9. c 调用java post方法_C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

  10. java 调用对象的方法_JAVA调用对象方法的执行过程

    JAVA调用对象方法的执行过程: ①.编译器查看对象的声明类型和方法名.假设调用x.f(parameter),  且隐式参数x声明为C类型的对象,有可能在C对象中存在多个参数类型和参数个数不同的f的方 ...

最新文章

  1. 2017-2-23 C#基础 中间变量
  2. 通用试题库管理系统 jsp mysql_通用在线考试系统 JSP+Servlet+MySQL
  3. 用于参考的学生信息管理系统(数据库简单 可自己参考创建)
  4. PKU2019暑期学堂 游记
  5. MySQL存储过程相互调用
  6. leetcode 377. 组合总和 Ⅳ(dp)
  7. linux打印jvm内存堆栈_jvm内存堆栈监控之jmap篇
  8. UVALive 6888 Ricochet Robots bfs
  9. 用 iOS-System-Services 框架获取iOS设备所用的设备信息
  10. shell手册--笨鸟杰作
  11. 最新计算机主板参数,电脑主板参数知识
  12. 基于Java实现一个简单的单词本Android App
  13. Drupal主题介绍
  14. 小米盒子2刷android tv,【二次搬运】小米盒子3S刷Android TV教程
  15. 【Matlab水果识别】形态学水果大小识别【含GUI源码 920期】
  16. Scapy:send函数剖析(参数、返回值、应用)
  17. 射频识别技术漫谈(4)——数据编码
  18. 2019利兹大学计算机排名,2019软科世界大学学术排名利兹大学排名第101-150
  19. 如何计算给定二叉树中的叶节点数?
  20. 快排两种实现及五种优化

热门文章

  1. 轻松搞定iOS自动化环境搭建
  2. 魔兽世界单机(芒果3.3.5a)机器人操作命令大全
  3. 网络安全——风险评估
  4. 虚拟机VMware破解版教程下载
  5. 也许你看了一本假的天龙八部
  6. python爬取淘宝数据魔方_淘宝数据魔方技术架构解析读后感
  7. Tungsten Fabric知识库丨更多组件内部探秘
  8. csharp基础练习题:过滤列表【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  9. 密码显示隐藏符号格式会变
  10. QualDash: Adaptable Generation of Visualisation Dashboards for Healthcare Quality Improvement