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

  最近在做和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. Hibernate的批量插入(&&JDBC)

    来自: http://blog.csdn.net/an_2016/article/details/51759890 一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入 ...

  2. 微信支付JsAPI

    https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip 下载获取微信支付demo压缩包 打开压缩包,并将其中 Wxpay ...

  3. Ubuntu 16.04环境布署小记

    本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. 安装Mono, Xsp 当前版本16.04.1的系统源的Mono版本为4.2.1,如需使用最新版本(本文书写时稳定版本为4.6 ...

  4. Innodb 表空间传输迁移数据

    在mysql5.5之前,mysql实例中innodb引擎表的迁移是个头疼的问题,要么使用mysqldump导出,要么使用物理备份的方法,但是在mysql5.6之后的版本中,可以使用一个新特性,方便地迁 ...

  5. 生成javadoc

    javadoc可以很方便的用来生成一些接口文档. 操作步骤: 1.export->javadoc 2.选择导出的位置 3.确定导出 常见异常: 1. 软件包 javax.servlet.http ...

  6. 【转】eclipse 创建struts2

    转载地址:http://blog.163.com/sean_zwx/blog/static/169032755201091595558378/ 今天我用Ecipse搭建Struts框架,并且使用Str ...

  7. 我的Android第五章

    今天我们来讲一下Android四大组件中的activity的生命周期, 首先我们可以看一张activity的生命周期的图解看一下 关于Activity的生命周期,有以下几个要注意的点: 1.最开始进入 ...

  8. 第1章 Sass简介

    什么是 CSS 预处理器? 定义: CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言 ...

  9. 关于iOS 10不能跳转设置的解决办法

    NSURL*url=[NSURL URLWithString:@"Prefs:root=WIFI"];  Class LSApplicationWorkspace = NSClas ...

  10. linux下的a.out文件

       当然这里,我更重要的是强调这个什么段,什么段.这以前就知道.但其实是对一个可以执行的c语言程序的分析.就好比你分析一篇作文.有标题.有段落. .out文件就是扩展名为out的文件,它本身不代表任 ...