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

  最近在做和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. Mac Mail PGP Setup 如何在苹果电脑上设置安全邮件 良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP)

    背景知识 良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP),一套用于讯息加密.验证的应用程序,采用IDEA的散列算法作为加密与验证之用. 关联文献:https://en.w ...

  2. Netsuite SuiteScript > Search Advance feature,搜索中使用 'OR' operation

    Sample in online help //Define search filter expression var filterExpression = [ [ 'trandate', 'onOr ...

  3. intel82599在centos6.5下编译安装

    .intel驱动下载地址:https://sourceforge.net/projects/e1000/files/ixgbe%20stable/ .编译安装步骤 yum install kernel ...

  4. JAVA模拟HTTP post请求上传文件

    在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较 ...

  5. javascript基础知识show

    1.javascript的数据类型是什么 基本数据类型:String,boolean,Number,Undefined,Null 引用数据类型:Object(Array,Date,RegExp,Fun ...

  6. Linux删除多个java进程的其中一个

    一.背景: Linux后台运行了多个Java程序,进程名都是java. 执行pkill java会一次性杀掉所有的java进程. 二.解决思路: 先通过一定的检索条件,定位出指定的java进程 然后解 ...

  7. pinpoint 安装部署

    .markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(171, 178 ...

  8. [poj2348]Euclid's Game(博弈论+gcd)

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9033   Accepted: 3695 Des ...

  9. python用来压缩目录的脚本

    import zipfile,os,sys def zip_dir(dirname, zipfilename): filelist = [] if os.path.isfile(dirname): f ...

  10. Bootstrap之Carousel不能自动播放的解决办法(转)

    Bootstrap是一个非常好的css/javaScript框架,尤其对于移动端的自适应和适配能力都比较强. 用Bootstrap自带的Carousel写了一个图片轮播的广告部分,用js调用后却出现了 ...