目前工作中,Python用的最多,但是很多数学计算在Python中运行,速度会很慢,而Python本身就是基于C开发的,而且它的很多第三方模块也是,所以Python对于C接口是支持的,所以在此记录一下,Python调用C接口的过程。在网上看了很多教程,都只有Python调用dll的code,对于dll的如何生成只字不提,或者是基于linux的.so文件。在单独搜索dll如何生成后,我按照以下的code生成了dll:
.cpp文件
#define EXPORT_MY_DLL #include <iostream> #include "sample.h" using namespace std; int gcd(int x, int y) { int g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; }.h文件
__declspec(dllexport) int gcd(int , int );网上很多生成dll的教程,就像上述code一样,这样生成的dll,c/c++程序调用是没有什么问题的,但是如果是Python调用就会出现如下的错误。
Python调用dll的code
import ctypes x = ctypes.c_int(10) y = ctypes.c_int(50) dll = ctypes.WinDLL('sample.dll') result = dll.gcd(x,y) print(result)会出现错误提示
会发现在dll中定义的函数找不到,虽然dll可以正常导入,我定义的函数名称叫gcd(),实现了两数求最大公约数的功能。如果,我们用下面的code,生成dll,同样的python调用code,是可以成功调用的,这份代码参考博客地址为:
https://blog.csdn.net/qq_28726333/article/details/80040239
.cpp文件
#define EXPORT_MY_DLL #include <iostream> #include "sample.h" using namespace std; MY_API int gcd(int x, int y) { int g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; }.h文件
#ifdef EXPORT_MY_DLL #define MY_API __declspec(dllexport) #else #define MY_API __declspec(dllimport) #endif extern "C" { MY_API int gcd(int , int ); }Python调用执行结果
我Python版本是3.6.5,我不确定是Python版本的关系,还是生成dll方式的关系,我只在以上生成dll的code上实现了Python调用dll文件的功能。而在实际更改code的过程中,extern “c”在dll的生成中,是必须加进去的,所以我的一个猜想是:Python对C的接口更支持,我用下面那个链接也试了一下,主要还是在extern “C”这,虽然下面这篇博客的评论有说我在上面提到的那个问题,即“function not found”,但是我实际测试了一下,完全没有,Python可以正常调用。
https://blog.csdn.net/weixin_38285131/article/details/81288338
知乎这篇文章验证了我的猜想,ctypes这个Python库确实对c++支持不是很好
https://zhuanlan.zhihu.com/p/20152309