Python调用c扩展记录——ctype

编写好cpp文件如下:

#include <stdio.h>  
#include<stdlib.h> 
#include<string.h>
extern "C"  
{  
    char* itype(int b)  
    { 
	    char*   s   = (char*)malloc(100   ); 
		sprintf(s,"%d",b);
		return s;
    }  
	char* ftype(float b)  
    { 
	    char*   s = (char*)malloc(100  ); 
        
		sprintf(s,"%f",b);
			
		return s;
    }
	char* stype(char* b)  
    { 
	    char*   s   =   (char*)malloc(100 ); 
        if (s) 
           strcpy   (   s   ,   b  ); 
        return  s; 
    }	
      
}  

g++ -shared -fPIC s.cpp -o liba.so编译成动态库,这里注意两点问题:

1 若采用g++ -c -shared -fPIC s.cpp -o liba.so编译会出现only ET_DYN and ET_EXEC can be loaded错误;

2若cpp中不声明extern "C" 则会出现AttributeError: ./s.so: undefined symbol: ftype错误;

完整编译好后生成liba.so

然后在Python中调用动态库liba.so

Python代码

# coding=gbk  
  
import ctypes as ct 
import time  
  
if __name__ == '__main__': 
    a   = "fds"
    a   = ct.c_char_p("ds") 
    dll = ct.cdll.LoadLibrary("./liba.so")
    b   = 2.5
    time_begin = time.clock() 
    if type(b)==float:
        b=ct.c_float(b)
        for i in range(50000):
            p=dll.ftype(a, b)
    elif type(b)==unicode:
        b=b.encode('GB18030')
    elif type(b)==int:
        for i in range(50000):
            p=dll.itype(a, b)
    elif type(b)==str:
        b=ct.c_char_p(b)
        for i in range(50000):
            p=dll.stype(a, b)        	
 
    t = time.clock() - time_begin          
    print("\nUse time: %s" %t) 
python代码中特别要注意传入参数的类型和调用动态库后返回值的类型要经过ctype转换。

至此,Python调用c扩展完毕。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值