jiang1799 发表于 2015-12-1 14:41:32

python 调用 C 动态库

  首先是 C 的头文件和源文件,



#ifndef POINT_H                  
#define POINT_H                  
struct point                     
{                                 
int x;                        
int y;                        
};                                 
void point_print(struct point * p);
#endif /* POINT_H */


#include <stdio.h>                        
#include "point.h"                        
void point_print(struct point * p)         
{                                          
printf("x = %d, y = %d\n", p->x, p->y);
}                                          
  下面是编译命令,



gcc -fPIC -shared point.c -o libpoint.so
  下面是 python 代码,



#! /usr/bin/python               
from ctypes import *            
class point(Structure):         
_fields_ = [                  
("x", c_int),            
("y", c_int)            
]                           
ptr = point(10, 20)               
libpoint = CDLL("./libpoint.so")
libpoint.point_print(byref(ptr))
libpoint.point_print(pointer(ptr))
  pointer 与 byref 的区别在于后者的效率高于前者,文档中提到如果只是向外部函数传递参数的引用,那么使用 byref 即可。下面运行,



$ ./point.py
x = 10, y = 20
x = 10, y = 20
$
  另外诸如字节序、对齐、返回值处理、类型转换和回调等等,可以参考这里。
页: [1]
查看完整版本: python 调用 C 动态库