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扩展完毕。



你可能感兴趣的:(linux)