开博客这么久以来,第一篇技术文章,python与c的接口对接
在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧。内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助。闲话少叙,开始正文。
最近在做和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的接口对接的更多相关文章
- 這是我既C語言作業寫博客後寫的第一篇博客
這篇博客應該算是寫給我自己的博客吧,所以這裏我想用繁體字寫,因為我漸漸地發現我已經很少使用到繁體字了,日常QQ聊天都使用簡體字,繁體字都懶得切換了,但是為了不讓別人麻煩,在外界交流的時候我會使用簡體字 ...
- c博客作业00--我的第一篇博客
1.你对网络专业或计算机专业了解是怎样? 一开始以为计算机网络专业就是搞跟计算机有关的东西,后来查了网络才知道,网络专业主要学计算机科学基础理论软硬件系统及应用知识 .网络工程的专业及应用知识. 2. ...
- c博客作业-我的第一篇博客
1.你对网络专业或者计算机专业了解是怎样的? 以前接触计算机,只是把它当作娱乐的工具,并没有太过了解,现在我通过查阅了解了一些计算机的知识. 计算机专业的学生要学习的不仅是会使用,而且要学习计算机的基 ...
- C博客作业--我的第一篇博客作业
1你对网络专业或计算机专业了解是怎样的 由于从小就与电脑打交道,对于各类软件的生产非常感兴趣,所以在高三开学查询有什么专业的时候,就打算报与计算机有关的专业.我对计算机专业感到非常神奇,毕竟只是看似简 ...
- C语言博客作业00--我的第一篇博客
1.你对网络专业或者计算机专业了解是怎样? 起初 起初对于我来说,计算机专业毕业后就相当于程序员,或者去开发一些游戏,软件等等,而学得特别优秀的可能会成为黑客,就像电影电视剧里演得那样,这是我一开始的 ...
- 基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传
前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...
- 将Markdown编辑器搬进您的博客-让我们更优雅的书写文章
各位小伙伴们,冷月今天给大家发一波福利.我们都知道markdown编辑器非常的好用,是我们写作的好帮手.这样的一款好用的文章编辑器,我们怎么才能让自己的博客也支持呢,冷月今天来教大家如何将Markdo ...
- 我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341
我的主博客在CSDN,这里只有部分文章,这是地址https://blog.csdn.net/z979451341
随机推荐
- centos7安装http服务
1.yum安装http [root@localhost ~]# yum install httpd -y 2.启动http服务 [root@localhost ~]# systemctl start ...
- C# 整数转二进制字符串
可以便于调试位运算 void Execute() { , ); , ); , ); Debug.Log("1: " + a); Debug.Log("2: " ...
- 【前端】js中new和Object.create()的区别
js中new和Object.create()的区别 var Parent = function (id) { this.id = id this.classname = 'Parent' } Pare ...
- python画图设置坐标轴大小
在console端输入python语句,会一句输一行,而且不保留你所做的操作,但是每一句之间加一个分号就能很好的解决. import pylab as Plot Plot.xlim(-150, 150 ...
- http错误码
2xx 成功 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 正常:已接受用于处理,但处理尚未完成. 203 正常:部分信息 - 返回的信息只是一部分. ...
- 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
今天给大家献上"C"级题:LJX的校园:入学典礼!! 试题编号:3120 LJX的校园:入学典礼 难度级别:C: 运行时间限制:45ms: 运行空间限制:256000K ...
- 理清C++常量指针和指针常量这团乱麻
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字 ...
- .zip版初次安装mysql时遇到的my.ini、服务无法启动以及设置登录密码的问题
下载mysql出现的问题 若下载的是.zip版,就是免安装的直接解压就可以的出现的问题 一.需要在E:\mysql\mysql-5.7.14-winx64目录下手动添加my.ini文件(.ini文件是 ...
- [OC]宏与const 的使用
Tip: OS日常工作之常用宏定义大全 (摘录文档地址,感觉还不错,例子简单易懂) extern字符串常量,宏定义字符串常量,怎么选? Define与Const专题 extern字符串常量,宏定义字符 ...
- 纯硬盘安装Kali 无需U盘
工具: EasyBCD 安装后启动,然后依次点击 添加新条目 >> NeoGrub >> 安装 然后如下图 点击配置,然后弹出一个记事本窗口,先最小化.进行如下操作: 1.拷贝 ...