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函数,实现物体检测. ...
随机推荐
- man rsync翻译(rsync命令中文手册)
本文为命令rsync的man文档翻译,几乎所有的选项都翻译了,另外关于筛选规则部分只翻译了一部分.由于原文很多地方都比较啰嗦,所以译文中有些内容可能容易让国人疑惑,所以我个人在某些地方加上了注释.若有 ...
- Hadoop笔记——技术点汇总
目录 · 概况 · Hadoop · 云计算 · 大数据 · 数据挖掘 · 手工搭建集群 · 引言 · 配置机器名 · 调整时间 · 创建用户 · 安装JDK · 配置文件 · 启动与测试 · Clo ...
- JVM常用启动参数
本文参考 jvm参数设置大全:http://www.cnblogs.com/marcotan/p/4256885.html 堆内存分配及gc:http://www.cnblogs.com/weiguo ...
- Spring mybatis源码篇章-MybatisDAO文件解析(一)
前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 加载指定的mybatis主文件 Mybatis模板文件,其中的属性 ...
- jqthumb.js缩略图插件-让缩略图正常显示而不变形
插件介绍 项目中有图片的时候,有的宽大于高,有的宽小于高,尤其在做图片列表的时候,经常发现缩略图会有变形的.我们怎样来解决这一问题呢. 方法一:用photoshop来处理缩略图.小的项目还可以,大的项 ...
- HDU1035 Robot Motion
Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...
- HDU6043 KazaQ's Socks
Problem Description KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbered f ...
- Charles录制App的接口har文件
Charles录制App的接口har文件 如果我们想录制我们自己App后台请求接口的信息,并生成har文件,要怎么做呢?其实很简单,就是通过Charles,让手机的访问请求走这个Charles代理就行 ...
- Java 三目运算符表达式的一些问题
最近在处理一个需求,需求描述如下:对数据库中查询出来的数据的某一个字段做一个简单处理.处理方式是:如果该字段的值(取值范围0~4,有可能为null)等于0,那么默认处理成1. 测试代码如下: publ ...
- 花了一年时间开发出来的EZNest 自动套料软件
随着国内钢结构制造业的迅猛发展,市场竞争也愈演愈烈.近来钢材价格的大幅攀升,节约用材已成为企制胜的戈键,提高钢材的利用车自然就成了目前许多企业十分关心的一件事.对十大型钢结构生产制造商来说,如留在传统 ...