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函数的更多相关文章

  1. Python 调用C函数

    /******************************************************************** * Python 调用C函数 * 说明: * Tony在处理 ...

  2. Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项

    问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...

  3. python调用模块&函数

    一般模块是抽象的概念,按照功能划分模块,尽可能保证每个模块互相独立. 一般模块里有多个函数.当然,如果你愿意,也可以把一个几个模块写进一个大函数.对于python 模块,每个模块可以包含多个函数,但一 ...

  4. python调用php函数

    由于php不支持多线程,所以想借助python搞一个.1.import subprocessimport time#Simple caller, disguard outputmethod=" ...

  5. 项目记录 -- python调用回调函数

    C源文件: static int get_callback(zpool_handle_t *zhp, void *data) { zprop_get_cbdata_t *cbp = (zprop_ge ...

  6. python 调用c语言函数

    虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...

  7. 【Python】python 调用c语言函数

    虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指定调用函数.这些函数 ...

  8. python调用c的方法

    虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...

  9. 在windows下用python调用darknet的yolo接口

    0,目标 本人计算机环境:windows7 64位,安装了vs2015专业版,python3.5.2,cygwin,opencv3.3,无gpu 希望实现用python调用yolo函数,实现物体检测. ...

随机推荐

  1. Java使用拦截器的两种方式

    拦截器是个好东西,之前用到过,现在记录一下,供以后参考使用! 其一,使用org.aspectj.lang.annotation.Aspect 先上代码: package com.test.interc ...

  2. 创建 Machine - 每天5分钟玩转 Docker 容器技术(46)

    对于 Docker Machine 来说,术语 Machine 就是运行 docker daemon 的主机.“创建 Machine” 指的就是在 host 上安装和部署 docker.先执行 doc ...

  3. LuaFramework热更新过程(及可更新的loading界面实现)

          1.名词解释: 资源包:点击 LuaFramework  |  Build XXX(平台名) Resource,框架会自动将自定义指定的资源打包到StreamingAssets文件夹,这个 ...

  4. Java Web开发中Spring+MyBatis框架的简单搭建

    这里使用的eclipse,首先创建一个动态web项目. 1.导入Spring IOC.AOP.DAO.dbcp.dbdrive.mybatis.jar . mybatis-spring.jar  本人 ...

  5. 我的学习之路_第三十四章_jsp

    jsp 在只有servlet时,输出页面内容比较麻烦(成本高,java代码中输出HTML标签),所以需要一种技术,主要是HTML页面的代码(HTML,css,js),可以嵌入java代码,来实现动态页 ...

  6. Stacked Regression的详细步骤和使用注意事项

    声明:这篇博文是我基于一篇网络文章翻译的,并结合了自己应用中的一些心得,如果有侵权,请联系本人删除. 最近做推荐的时候,开始接触到Stacking方法,在周志华老师的西瓜书中,Stacking方法是在 ...

  7. HDU-2017-字符串统计

    /* Name: HDU-2017-字符串统计 Date: 18/04/17 20:19 Description: 水过 */ #include<bits/stdc++.h> using ...

  8. 【思维】【水】 南阳oj 喷水装置(一)

    描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1& ...

  9. rpmrebuild备份glibc

    任务: 备份已安装的glibc为RPM包,还原. 准备: 下载rpmrebuild 上传至服务器 链接: https://pan.baidu.com/s/1pKNGnur 密码: wgy9 操作: 1 ...

  10. 《撸轮子系列》之LoadPE

    前言 我新书<Python爬虫开发与项目实战>出版了. 这本书包括基础篇,中级篇和深入篇三个部分,不仅适合零基础的朋友入门,也适合有一定基础的爬虫爱好者进阶,如果你不会分布式爬虫,不会千万 ...