在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧。内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助。闲话少叙,开始正文。

  最近在做和python相关的项目,需要对接C++算法库,这对于我这种刚刚接触python的新手来说,着实有些麻烦,而且,新平台又是在python3上进行的,因此还需要考虑到,python3与python2.7的不同之处,还真心感到有点混乱,不过经过努力终于成功的实现了,python与c++算法库的对接。现在将实现过程记录如下:

  首先python是支持调用C库的,这也是python能够广泛被使用的原因之一,但是C++与C还是有所不一样,因此适用于C的方法,到了C++这里要做点相应的改动。如下:

在C++中有这样的类函数:

int ClassA :: process (char *p, int a, int b)

{

.......

}

将这个process接口函数 声明为C函数

extern "c"

{

ClassA c;

process_python(char* p, int a, int b){

  c.process(p, a, b);

}

将c库用gcc 编译为.so,这个过程网上有很多,不赘述,直奔主题。python调用c的.so库不需要额外的封装接口,十分方便。将c++的接口函数声明为C类型后,就可以在python中直接使用了。是不是该结束?No,如果到此就结束了,网上有好多,我还写啥啊,这里要说的是后面实现的注意事项。

python 调用C函数的方法

在python中采用ctypes模块来进行调用,在python2.5之后,该模块都被集成在python中,不需要安装,直接使用即可。

#!/usr/bin/python3

from ctypes import *

import os

import sys

if __name__ == "__main__":

  libtest = cdll.LoadLibrary(os.getcwd() + '/libprocess.so')

test = libtest.process_python

test.argtypes = [c_char_p, c_int, c_int]  #这里要特别注意,一定要声明函数的输入类型,转化为C类型,不然C接口是不认识输入数据的

test(sys.argv[1].encode(), int(sys.argv[2]), int(sys.argv[3])) #这里也要注意,因为在python3中string和bytes不同,需要进行编解码转换,不然数据类型是不匹配的

#还有一点,C++中有string类,但是C语言中没有,所以接口函数如果有string类的要替换为char型

注意了以上几点就可以正常运行了,说来简单,但是自己摸索的时候,真心花费了大量时间,希望大家不要走重复的弯路。

  最后,希望大家多多和我交流,提意见,有更好的实现方法和不足之处也欢迎大家,指出。不吝赐教哟~^_^

开博客这么久以来,第一篇技术文章,python与c的接口对接的更多相关文章

  1. 這是我既C語言作業寫博客後寫的第一篇博客

    這篇博客應該算是寫給我自己的博客吧,所以這裏我想用繁體字寫,因為我漸漸地發現我已經很少使用到繁體字了,日常QQ聊天都使用簡體字,繁體字都懶得切換了,但是為了不讓別人麻煩,在外界交流的時候我會使用簡體字 ...

  2. c博客作业00--我的第一篇博客

    1.你对网络专业或计算机专业了解是怎样? 一开始以为计算机网络专业就是搞跟计算机有关的东西,后来查了网络才知道,网络专业主要学计算机科学基础理论软硬件系统及应用知识 .网络工程的专业及应用知识. 2. ...

  3. c博客作业-我的第一篇博客

    1.你对网络专业或者计算机专业了解是怎样的? 以前接触计算机,只是把它当作娱乐的工具,并没有太过了解,现在我通过查阅了解了一些计算机的知识. 计算机专业的学生要学习的不仅是会使用,而且要学习计算机的基 ...

  4. C博客作业--我的第一篇博客作业

    1你对网络专业或计算机专业了解是怎样的 由于从小就与电脑打交道,对于各类软件的生产非常感兴趣,所以在高三开学查询有什么专业的时候,就打算报与计算机有关的专业.我对计算机专业感到非常神奇,毕竟只是看似简 ...

  5. C语言博客作业00--我的第一篇博客

    1.你对网络专业或者计算机专业了解是怎样? 起初 起初对于我来说,计算机专业毕业后就相当于程序员,或者去开发一些游戏,软件等等,而学得特别优秀的可能会成为黑客,就像电影电视剧里演得那样,这是我一开始的 ...

  6. 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  7. 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传

    前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...

  8. 将Markdown编辑器搬进您的博客-让我们更优雅的书写文章

    各位小伙伴们,冷月今天给大家发一波福利.我们都知道markdown编辑器非常的好用,是我们写作的好帮手.这样的一款好用的文章编辑器,我们怎么才能让自己的博客也支持呢,冷月今天来教大家如何将Markdo ...

  9. 我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341

    我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341

随机推荐

  1. T-sql 查询

    ------------------case---when-------的使用--------------------- select  userAccount , eatingDate ,    c ...

  2. mysql 5.6 online ddl

    innodb存储引擎实现online ddl的原理是在执行创建或删除操作的同时,将DML操作日志写入到一个缓存中,待完成索引创建后再重做应用到表上,以此达到数据的一致性,这个缓存大小由参数innodb ...

  3. 突击战UVa11729Commando War

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=117&page= ...

  4. OC-内存管理

    解铃还须系铃人 --1--内存管理的原理及分类 1.1 内存管理的原理 1.2 内存管理的分类 --2--手动内存管理 2.1 关闭ARC的方法 2.2 手动管理(MRC)快速入门 --3-- 内存管 ...

  5. Java 基础练习题2

    按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现int met ...

  6. [ASM C/C++] C语言数组

    固定长度的数组: 可以具有任何的存储类别. 长度可变的数组: 只能具有自动的生存周期(定义于语句块内,眀没有static修饰符). 名字必须为一般的标识符,因此结构或联合的成员不能是数组的标识符. 读 ...

  7. 双层路由设置,WAN口和LAN口连接的方法设置

    WAN口设置方法,社路由器分别为路1 和路2 1 路2的LAN口地址改为172.16.1.1,重启 2 笔记本改成172.16.1.X,然后进入设置,在里面WAN地址设置为静态地址 192.168.1 ...

  8. Centos7永久修改主机名

    最近在编写centos6.x的启动脚本,考虑到以后系统会升到7.x,故想让脚本兼容7.x,还是有一些和6版本不一样的地址,修改主机名比较常用,特此记录一下 1.命令行修改: hostnamectl s ...

  9. VS配置路径和宏

    http://blog.csdn.net/puttytree/article/details/7838419

  10. inline、block、inline-block的区别

    http://www.cnblogs.com/KeithWang/p/3139517.html