Python调用vs2015生成的dll文件

系统 1878 0

 

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

会出现错误提示

Python调用vs2015生成的dll文件_第1张图片

会发现在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调用vs2015生成的dll文件_第2张图片

我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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论