首页 > 代码库 > python 调用 C 动态库

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 = 20x = 10, y = 20$ 

另外诸如字节序、对齐、返回值处理、类型转换和回调等等,可以参考这里。

python 调用 C 动态库