python 调用 C 动态库

来源:互联网 发布:c# 高级编程教程 编辑:程序博客网 时间:2024/04/29 21:41

首先是 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$ 

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

原创粉丝点击