Python 调用 C/C++ 动态链接库

发布时间: 更新时间: 总字数:400 阅读时间:1m 作者: IP上海 分享 网址

Python 调用 C/C++ 动态链接库

介绍

  • ctypes 是 Python 的外部函数库。它提供与 C 兼容的数据类型,并允许调用 DLL 或共享库 SO 中的函数
    • 可用于将这些库包装在纯 Python 中
  • ctypes与C数据类型对比
ctypes数据类型 C数据类型
c_char char
c_short short
c_int int
c_long long
c_float float
c_double double
c_void_p void
c_uint8 unsigned char

C 示例

C 编译为 so 动态链接库

  • test.h
#include "stdio.h"

void sayhi();
int max(int, int);
  • test.c
#include "test.h"

void sayhi(){
  printf("hi so.\n");
}

int max(int a, int b)
{
    return a > b ? a : b;
}
  • 编译脚本
gcc -fPIC -shared test.c -o libtest.so

说明:

  • -shared 编译为共享库
  • -fPIC Position Independent Code 的缩写,编译生成的链接库与位置无关

调用示例

  • test.py
#!/usr/bin/env python3

from ctypes import *


test = cdll.LoadLibrary("./libtest.so")

test.sayhi()

max =test.max
max.argtypes = [c_int, c_int]
max.restype = c_int

a = 1
b = 2

print(f'a: {a}, b: {b} max is {max(1, 2)}')
  • 运行结果
$ python3 test.py
hi so.
a: 1, b: 2 max is 2

C++ 示例

  • pybind11 是一个轻量级的头文件库,它在Python中公开c++类型,反之亦然,主要用于为现有的c++代码创建Python绑定。它的目标和语法类似于出色的Boost。由David Abrahams编写的Python库:通过使用编译时自省推断类型信息来最小化传统扩展模块中的样板代码。
pip3 install pybind11
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数