• 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
    ", 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
    $ 

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

  • 相关阅读:
    类数组及其转换
    数组去重
    ios UIView
    ios 解决Wkwebview闪烁问题
    ios Https问题
    UUID
    JavaScript4
    JavaScript2
    JavaScript1
    UIScollView
  • 原文地址:https://www.cnblogs.com/wendellyi/p/4231774.html
Copyright © 2020-2023  润新知