python调用C函数
python 与 c可以相互调用,在做后台服务时底层服务用C/C++编写,通过python调用C库可以极大的提高开发效率。
下面对几种调用方式举例说明
1 python通过指针传递浮点型数组给C函数
bird = cdll.LoadLibrary("./bird.so")
aList=[1.0, 1.1, 1.2, 1.3, 1.4, 1.5]
arrayMy = (c_float*len(aList))
a = arrayMy()
for i in range(0, len(a)):
a[i] = aList[i]
count = c_int(len(a))
bird.ptr_test(a, count)
这里注意调用C函数时传入的数组类型定义方法与初始值设定,ctypes模块定义了与C语言数据类型对应的python类型,调用C函数时要确保传入类型一致。
2 python通过指针传递字符串数组给C函数
info='Hello , glade to meet you!'
pInfo = create_string_buffer(info, len(info))
bird.buf_in_test(info, sizeof(pInfo))
注意create_string_buffer的作用是把python中的字符串类型转换为一个指针指向的字符串数组。
3 python接收C函数返回的字符串以及长度
bufLen = 100
c_pBuf = create_string_buffer('', bufLen)
c_bufLen = c_int(bufLen)
bird.buf_out_test(c_pBuf, byref(c_bufLen)) print c_bufLen.value
print string_at(c_pBuf)
注意byref是通过指针地址传入参数
4 C函数里分配内存传给python使用
ptr_char = pointer(c_char())
retlen = c_int(0)
bird.malloc_test(byref(ptr_char), byref(retlen)) print string_at(ptr_char)
print retlen.value bird.free_test(ptr_char)
注意python里定义一个字符指针的方法ptr_char = pointer(c_char()),定义一个整型变量的方法retlen = c_int(0) , byref(ptr_char)取指针的地址传入函数。
5 测试的python与C源码
#!/usr/bin/python from ctypes import * bird = cdll.LoadLibrary("./bird.so") aList=[1.0, 1.1, 1.2, 1.3, 1.4, 1.5] arrayMy = (c_float*len(aList))
a = arrayMy()
for i in range(0, len(a)):
a[i] = aList[i] count = c_int(len(a))
bird.ptr_test(a, count) info='Hello , glade to meet you!'
pInfo = create_string_buffer(info, len(info))
bird.buf_in_test(info, sizeof(pInfo)) bufLen = 100
c_pBuf = create_string_buffer('', bufLen)
c_bufLen = c_int(bufLen)
bird.buf_out_test(c_pBuf, byref(c_bufLen)) print c_bufLen.value
print string_at(c_pBuf) ptr_char = pointer(c_char())
retlen = c_int(0)
bird.malloc_test(byref(ptr_char), byref(retlen)) print string_at(ptr_char)
print retlen.value bird.free_test(ptr_char)
#include <stdio.h>
#include <string.h>
#include <stdlib.h> int ptr_test(float * ptr, int count)
{
if(ptr){
int i = ;
printf("\n");
for (i = ; i < count; ++i){
printf("%f | ", ptr[i]);
}
printf("\n");
}
return ;
} int buf_in_test(char*buf, int len)
{
if(buf){
int i = ;
printf("\n");
for (i = ; i < len; ++i){
printf("%c", buf[i]);
}
printf("\n");
}
return ;
} int buf_out_test(char*buf, int *len)
{
if(buf){
char *test_str = "hello world!";
memcpy(buf, test_str, strlen(test_str));
*len = strlen(test_str);
}
return ;
} int malloc_test(char **pBuf, int *len)
{
*pBuf = (char*)malloc();
printf("malloc add:%p\n", *pBuf);
*len = ;
memcpy(*pBuf, "hello", );
return ;
} int free_test(char *pBuf)
{
if (pBuf){
printf("free add:%p\n", pBuf);
free(pBuf); }
return ;
}
6 ctypes里定义的数据类型与C语言数据类型对应关系
python调用C函数的更多相关文章
- Python 调用C函数
/******************************************************************** * Python 调用C函数 * 说明: * Tony在处理 ...
- Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项
问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...
- python调用模块&函数
一般模块是抽象的概念,按照功能划分模块,尽可能保证每个模块互相独立. 一般模块里有多个函数.当然,如果你愿意,也可以把一个几个模块写进一个大函数.对于python 模块,每个模块可以包含多个函数,但一 ...
- python调用php函数
由于php不支持多线程,所以想借助python搞一个.1.import subprocessimport time#Simple caller, disguard outputmethod=" ...
- 项目记录 -- python调用回调函数
C源文件: static int get_callback(zpool_handle_t *zhp, void *data) { zprop_get_cbdata_t *cbp = (zprop_ge ...
- python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...
- 【Python】python 调用c语言函数
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...
- python调用c的方法
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...
- 在windows下用python调用darknet的yolo接口
0,目标 本人计算机环境:windows7 64位,安装了vs2015专业版,python3.5.2,cygwin,opencv3.3,无gpu 希望实现用python调用yolo函数,实现物体检测. ...
随机推荐
- SSM整合学习笔记
对学习Spring+Spring MVC+Mybatis过程中出现的问题解决办法汇总 出现的问题 1.pom.xml报错 右键项目->maven->update project 因此每次更 ...
- Maven安装及使用-超级图文初级篇-
针对新手刚接触maven,并且不知道如何去搭建和使用maven,那么我来写一篇浅显易懂的初级篇教程吧. 不同的是,别人会先将概念再安装,我来帮大家先搭建好以后再去看概念,不然概念会变的很模糊. 安装: ...
- 【echart】学习笔记
1. x 轴 y轴 的max min 只能为5的倍数 2.
- opencv3+版本感觉还是不稳定啊
opencv3+版本感觉还是不稳定啊,还是安装opencv2的版本比较好.特征匹配需要下载额外的库,但是camke的时候就是有错误....也是醉了,折磨的我死去活来的两三天了. 现在是opencv3. ...
- CSS禁止用户选择复制
-webkit-user-select:none ;-moz-user-select:none; P.S. -wekit-gg浏览器 -moz -ff浏览器 WebKit 是一个开源的浏览器引擎,与之 ...
- HTML+CSS+JS简介
1.HTML与 CSS 1 1.1 HTML 1 1.2 HTML5 2 1.2.1 HTML5的特性 3 1.3 CSS 4 2.JavaScript 6 2.1特性 7 2.2编程 8 3.Sp ...
- MySQL开发指南
数据库开发是数据库管理系统(DBMS)和数据库应用软件设计研发的总称,数据运维.参与数据库生产环境的问题优化和解决等方面的事宜. 1.关于MySQL数据库 2.搭建MySQL环境 3.入门常用SQL. ...
- 【NO.12-2】jmeter-执行脚本
//拿jmeter举例 //要进入到jmeter工具的bin目录 //当使用其它的开源测试工具的时候,也可以参考上面这一点,即:进入到bin目录 //如果工具本身不包含bin文件,那么在工具的1级目录 ...
- nio系列(一)---nio重要组成
nio重要组成部分 前言:通过本文可以了解nio的重要组成部分,了解完基础的内容后后面理解才会简单一点.下一篇会讲讲nio的应用和io的对比.如果有不正确的地方还望指正. channel chanel ...
- session和cookie的辨析[阅读]
session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键.基于网上一些文章和资料的参阅,及作者个人的应用体会,对这 ...