Python调用vs2015生成的dll文件

       目前工作中,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

猜你喜欢

转载自blog.csdn.net/Asunqingwen/article/details/90481322
今日推荐