Python C/C++ 使用ctypes编写拓展

820 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金 图片

ctypes 是一个Python 标准库中的一个库。为了实现调用 DLL,或者共享库等C数据类型而设计.它可以把这些C库包装后在纯Python环境下调用.本教程使用的环境是在mac系统下进行的.

我们直接来看代码代码

C++代码

#include <stdio.h>
#ifdef __cplusplus 
    #define XETR extern "C"
#else
    #define XETR
#endif   

#ifdef _WIN32
    #define LIB XETR __declspec(dllexport)
#else
    #define LIB XETR
#endif

LIB  void CtypesDemo(const wchar_t *str,int x,int y){
    printf("Cpp %ls %d\n",str,x+y);
}        

因为系统不同,调用方式不同
_WIN32:主要是windows系统上用的,用来表示win32或者win64\

__declspec(dllexport):用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等

extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。

将C++文件编译成so文件

g++ -fPIC -shared -o ctypes ctypes.cpp

windows用户可以使用Visual studio 2015编译生成dll文件。
在mac和linux没有dll文件,一般都是so文件。

Python代码调用

编译成功之后我们就可以调用了,这里Python提供了专门用来交互的库ctypes,使用方式如下

from  ctypes import *
lib=CDLL("ctypes")
lib.CtypesDemo("hello",4,5)

然后我们就可以看到输出的内容了

总结

关于ctype是的基本用法大概就这么多,实际上在编写Python拓展库的时,如果要最终生成Python模块并导入使用,就要遵循Python API进行编写,所有的函数定义都是遵循一定的规则,如何使用C语言进行Python模块的拓展编写,可以看之前的这个文章juejin.cn/post/702171…