目前工作中,Python用的最多,但是很多数学计算在Python中运行,速度会很慢,而Python本身就是基于C开发的,而且它的很多第三方模块也是,所以Python对于C接口是支持的,所以在此记录一下,Python调用C接口的过程。在网上看了很多教程,都只有Python调用dll的code,对于dll的如何生成只字不提,或者是基于linux的.so文件。在单独搜索dll如何生成后,我按照以下的code生成了dll:
.cpp文件
#define EXPORT_MY_DLL
#include
#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
#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