python调用c++动态库_Python调用C/C++动态链接库的方法
本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下:
示例一:
首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件:
//hello.h
#ifdef EXPORT_HELLO_DLL
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif
extern "C"
{
HELLO_API int IntAdd(int , int);
}
CPP文件:
//hello.cpp
#define EXPORT_HELLO_DLL
#include "hello.h"
HELLO_API int IntAdd(int a, int b)
{
return a + b;
}
这里有两个注意点:
(1)弄清楚编译的时候函数的调用约定采用的__cdecl还是__stdcall,因为根据DLL中函数调用约定方式,Python将使用相应的函数加载DLL。
(2)如果采用C++的工程,那么导出的接口需要extern "C",这样python中才能识别导出的函数。
我的工程中采用__cdecl函数调用约定方式进行编译链接产生hello.dll,然后Python中采用ctypes库对hello.dll进行加载和函数调用:
from ctypes import *
dll = cdll.LoadLibrary('hello.dll');
ret = dll.IntAdd(2, 4);
print ret;
至此,第一个小例子已经完成了,读者可以自己动手尝试一下运行效果。
示例二:
示例一只是一个"hello world"级别的程序,实际运用中更多的需要传递数据结构、字符串等,才能满足我们的需求。那么本示例将展示,如何传递数据结构参数,以及如何通过数据结构获取返回值。
首先编写DLL工程中的头文件:
//hello.h
#ifdef EXPORT_HELLO_DLL
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif
#define ARRAY_NUMBER 20
#define STR_LEN 20
struct StructTest
{
int number;
char* pChar;
char str[STR_LEN];
int iArray[ARRAY_NUMBER];
};
extern "C"
{
//HELLO_API int IntAdd(int , int);
HELLO_API char* GetStructInfo(struct StructTest* pStruct);
}
CPP文件如下:
//hello.cpp
#include
#define EXPORT_HELLO_DLL
#include "hello.h"
HELLO_API char* GetStructInfo(struct StructTest* pStruct)
{
for (int i = 0; i < ARRAY_NUMBER; i++)
pStruct->iArray[i] = i;
pStruct->pChar = "hello python!";
strcpy (pStruct->str, "hello world!");
pStruct->number = 100;
return "just OK";
}
GetStructInfo这个函数通过传递一个StructTest类型的指针,然后对对象中的属性进行赋值,最后返回"just OK".
编写Python调用代码如下,首先在Python中继承Structure构造一个和C DLL中一致的数据结构StructTest,然后设置函数GetStructInfo的参数类型和返回值类型,最后创建一个StructTest对象,并将其转化为指针作为参数,调用函数GetStrcutInfo,最后通过输出数据结构的值来检查是否调用成功:
from ctypes import *
ARRAY_NUMBER = 20;
STR_LEN = 20;
#define type
INTARRAY20 = c_int * ARRAY_NUMBER;
CHARARRAY20 = c_char * STR_LEN;
#define struct
class StructTest(Structure):
_fields_ = [
("number", c_int),
("pChar", c_char_p),
("str", CHARARRAY20),
("iArray", INTARRAY20)
]
#load dll and get the function object
dll = cdll.LoadLibrary('hello.dll');
GetStructInfo = dll.GetStructInfo;
#set the return type
GetStructInfo.restype = c_char_p;
#set the argtypes
GetStructInfo.argtypes = [POINTER(StructTest)];
objectStruct = StructTest();
#invoke api GetStructInfo
retStr = GetStructInfo(byref(objectStruct));
#check result
print "number: ", objectStruct.number;
print "pChar: ", objectStruct.pChar;
print "str: ", objectStruct.str;
for i,val in enumerate(objectStruct.iArray):
print 'Array[i]: ', val;
print retStr;
总结:
1. 用64位的Python去加载32位的DLL会出错
2. 以上只是些测试程序,在编写Python过程中尽可能的使用"try Except"来处理异常
3. 注意在Python与C DLL交互的时候字节对齐问题
4. ctypes库的功能还有待继续探索
文章来自:http://www.jb51.net/article/52513.htm
python调用c++动态库_Python调用C/C++动态链接库的方法相关推荐
- python调用c++动态库_Python应用:调用C/C++动态链接库的方法详解
Linux系统下调用动态库(.so) 1.linuxany.c代码如下: #include "stdio.h" void display(char* msg){ printf(&q ...
- python调用.a静态库_Python 调用 C
了解了相关资料 不折腾的方法有(以往文章有): pypy,numba,numpy 但都不是 纯正的 C 折腾的: cffi,Cython,Boost.Python,Cpython 自带模块,SWIG ...
- python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法
前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...
- python调用.net动态库
# python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...
- python调用c++动态库
python调用C++动态库 生成C++动态库 1.编译成64位的dll库 2. C++ 模板 3. 示例 Python调用带参数的动态库 python与c数据类型 int.long.float.do ...
- pythonnet 详解,Python调用.net动态库实现过程解析
pythonnet简介 pythonnet是cpython的扩展 pythonnet提供了cpython和.net程序集之间交互的桥梁 pythonnet开源在github上 pythonnet安装 ...
- python调用c的配置文件_python调用c
python一个非常的大的优点就是开发效率高,非常不好的缺点就是执行效率低:然而c语言有个则刚好相反.还有一点python的对源码的保护做不到,即使你用py2exe,pyinstaller这样的方法也 ...
- go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...
Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...
- Node.js 调用 dll动态库 以华旭身份证阅读器为例
需求来源 由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成. 版本说明: node v12.18.3 (32位) np ...
最新文章
- Python数据挖掘:绘制直方图,设置上下限和步长,绘制子图
- iCup,USB加热饮品方案
- html2canvas在Vue项目踩坑-生成图片偏移不完整
- 送你一份 Nginx 最佳入门手册
- 安卓移动应用开发考题_Android移动应用试卷试题带答案.doc
- Linux 进程管理命令之pidof
- 【CyberSecurityLearning 15】VLAN技术与Trunk
- That assembly does not allow partially trusted callers.
- 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
- LATEX调整公式、图片与正文间距离,文字间距离,调整空白大小
- NG Ng-template(模板元素)
- Cisco交换机设置管理IP
- Mac系统如何安装php,MAC系统如何快速安装php
- input type类型_005 类型转换,我的存款是负值
- 宏碁e5-572g重装linux,Acer-E5-572G笔记本U盘装原版win10系统教程
- 【分享】豆瓣上排名top100的书籍
- FileSplit cannot be cast Exception
- archlinux下Thinkpad的trackpoint配置
- 100ask imx6ull开发板移植NXP官方UBOOT
- 机器人编程语言有哪些? 这5大编程语言的优缺点你都了解?
热门文章
- 【Python】创建数组[[0]*n]*m与[[0 for _ in range(n)] for _ in range(m)]的区别
- 【Leetcode】几种简单的排序算法
- [云炬创业管理笔记]第四章把握创业机会测试3
- [云炬创业基础笔记]第二章创业者测试3
- [云炬看世界]个人站长
- 获取keras中间层输出、模型保存与加载
- Nhibernate 对view 查询的几种方法
- 应用程序通用开发框架
- Delphi中Tobject与Variant之间的转换
- 如何简化临时内存的分配与释放