python引用C++ DLL文件若干解释及示例
python引用C++ DLL文件若干解释及示例
首先说一下,python不支持C++的DLL,但是支持C的DLL;C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提
首先我这儿的示例使用VS2017编译的DLL,先讲过程,再解释
第一步,新建DLL项目

确定之后我们可以看到默认的文件

这时候我们需要新建一个与Test.cpp对应的头文件

这是完成之后的代码结构

下面是Test.h文件的内容和Test.cpp文件的内容及相应解释
// Test.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "Test.h"
bool Test1()
{
return true;
}
bool Test2()
{
return false;
}
首先我们需要引用Test.h,也就是我们刚刚建立的与之匹配的头文件
Test1和Test2就是我们写的python需要调用的函数,因为python在调用DLL时除了int型其他的返回类型都需要指定,所以我用bool来展示
//Test.h
#pragma once
extern "C" __declspec(dllexport) bool Test1();
extern "C" __declspec(dllexport) bool Test2();
这是我们建立的头文件
第一行VS自动生成,不用管它,它的作用是保证头文件只被编译一次
第二行和第三行就是我们要添加的代码,这两行就是我们定义的函数,有点像以前学C语言的时候老师说的定义在main函数后面的函数要在前面先写一次,记住这个形式就好了。我来讲讲前面的代表什么意思
- extern “C”
这个的意思是声明的函数可以被其他模块调用,并且编译为C文件
- __declspec(dllexport)
这是MS VC中专用的关键字,表示将函数、类等声明为导出函数,供其他程序调用
这两个加起来添加到头文件里,声明的函数编译出来就可以被python调用了
python调用方法也很简单
from ctypes import *
dll = CDLL("Test.dll")
dll.Test1.restype = c_bool
# restype是函数的返回类型,c_bool代表返回bool类型,这里的对应关系就自己查一下了
# 除了restype还有argtypes,代表函数的参数类型
print(dll.Test1())
整体大致就是这样了,如果没成功可以给我留言看看,我也是个新手,最近因为一个项目才用到Python,如果有什么不对的请批评指正
关于ctypes的部分,主要参考了这篇博文,感谢”无尽的数字眩晕症“
https://www.cnblogs.com/night-ride-depart/p/4907613.html
python引用C++ DLL文件若干解释及示例的更多相关文章
- C# 动态修改dll的签名 以及修改引用该dll文件的签名
在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...
- C# 将引用的DLL文件放到指定的目录下
原文:C# 将引用的DLL文件放到指定的目录下 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sweety820/article/details/2 ...
- 直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题
直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了 ...
- 用vc生成可被python调用的dll文件
前提已经有.c 和.i文件 用swid编译了.i文件生成了wrap.c文件和.py文件 vc创建dll工程 将.h加入到头文件中.c文件和wrap.c文件添加到源文件中 将.i文件添加到工程目录下To ...
- VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 <转>
昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁 ...
- 转载:C# 将引用的DLL文件放到指定的目录下
当软件引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱,如果能把dll放到响应的文件夹下面,就方便很多 下面是解决该问题的一种方法: 右键点击项目:属性->设置,项目会生成 ...
- Vs 引用第三方DLL文件 版本不一致问题 (npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案)
最近在 做 MailChimp 与网站功能 集成时,发现 MailChimp 2API 中的 MailChimp.dll 中的依赖项 SerivceStack.Text.dll (版本为3.9.71 ...
- VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
1. 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4. 而我原来的设置是.NET Framework 4 Client Pro ...
- 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件
出现这个问题,是由于使用了非.NET 的动态链接库,需要注册 方法如下: 1.在搜索程序和文件中使用 regsvr32 "D:\Projects\8.01.01.03-重庆大足\lib\Va ...
随机推荐
- JavaScript——三
任务: 其中的"options = options || {}"就代表如果options是一个真的对象,就使用它,否则就给他默认值 在Node函数中: 函数中的this指向wind ...
- linux下安装python3.7.2
1.到python的官网去下载python3.7.2安装包,必须是Linux版本的 2.在/usr/tmp下下载python安装包 wget https://www.python.org/ftp/py ...
- 获取txt编码方式
在操作txt的时候,有时会出现乱码,这是因为没有使用正确的编码方式来操作txt,我们需要先获取txt的编码方式,再进行读写操作.下面是获取txt编码的方法: /// <summary> / ...
- java笔试中创建String对象的思考
题目是这样的下面那些生成新的String对象() A . String s = new String(); B . String s = new String("A"); C. ...
- codeforces 1045I Palindrome Pairs 【stl+构造】
题目:戳这里 题意:给1e5个字符串,问有多少对字符串组合,满足最多只有一种字符有奇数个. 解题思路:每种情况用map存一下就行了.感觉这题自己的代码思路比较清晰,所以写个题解记录一下 附ac代码: ...
- Single Round Math sdut3260高精度除以低精度
做高精度除法,从高位开始除..高位除剩下的我们就*10扔给低一位处理,最终余数是在最低位取模得到的 高精除以高精,我们可以这么做,让除数在后面补零,刚好小于被除数,作若干次减法,减的次数加到商里面 然 ...
- 如何使用 js 实现tooltips 的 hover 时候坐标的自动计算
如何使用 js 实现tooltips 的 hover 时候坐标的自动计算 js 监听 mouseover event https://developer.mozilla.org/zh-CN/docs/ ...
- 如何在 Apple Watch S6上离线播放音乐
如何在 Apple Watch S6上离线播放音乐 Apple Watch 离线播放音乐 营销策略,捆绑销售 Apple Watch + AirPods + Apple Music Apple Wat ...
- Self-publishing 自出版
Self-publishing 自出版 出书 传统出版 在过去的几十年中,发布意味着要经过代理商和发布者. 自出版 如今,自助出版允许作者绕过出版商和书店,直接向公众出售. refs https:// ...
- leetcode solution cracked tutorial
leetcode solution cracked tutorial problemset https://leetcode.com/problemset/all/ Top Interview Que ...