本文以实例讲解了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++动态链接库的方法相关推荐

  1. python调用c++动态库_Python应用:调用C/C++动态链接库的方法详解

    Linux系统下调用动态库(.so) 1.linuxany.c代码如下: #include "stdio.h" void display(char* msg){ printf(&q ...

  2. python调用.a静态库_Python 调用 C

    了解了相关资料 不折腾的方法有(以往文章有): pypy,numba,numpy 但都不是 纯正的 C 折腾的: cffi,Cython,Boost.Python,Cpython 自带模块,SWIG ...

  3. python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...

  4. python调用.net动态库

    # python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...

  5. python调用c++动态库

    python调用C++动态库 生成C++动态库 1.编译成64位的dll库 2. C++ 模板 3. 示例 Python调用带参数的动态库 python与c数据类型 int.long.float.do ...

  6. pythonnet 详解,Python调用.net动态库实现过程解析

    pythonnet简介 pythonnet是cpython的扩展 pythonnet提供了cpython和.net程序集之间交互的桥梁 pythonnet开源在github上 pythonnet安装 ...

  7. python调用c的配置文件_python调用c

    python一个非常的大的优点就是开发效率高,非常不好的缺点就是执行效率低:然而c语言有个则刚好相反.还有一点python的对源码的保护做不到,即使你用py2exe,pyinstaller这样的方法也 ...

  8. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  9. Node.js 调用 dll动态库 以华旭身份证阅读器为例

    需求来源 由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成. 版本说明: node v12.18.3 (32位) np ...

最新文章

  1. Python数据挖掘:绘制直方图,设置上下限和步长,绘制子图
  2. iCup,USB加热饮品方案
  3. html2canvas在Vue项目踩坑-生成图片偏移不完整
  4. 送你一份 Nginx 最佳入门手册
  5. 安卓移动应用开发考题_Android移动应用试卷试题带答案.doc
  6. Linux 进程管理命令之pidof
  7. 【CyberSecurityLearning 15】VLAN技术与Trunk
  8. That assembly does not allow partially trusted callers.
  9. 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
  10. LATEX调整公式、图片与正文间距离,文字间距离,调整空白大小
  11. NG Ng-template(模板元素)
  12. Cisco交换机设置管理IP
  13. Mac系统如何安装php,MAC系统如何快速安装php
  14. input type类型_005 类型转换,我的存款是负值
  15. 宏碁e5-572g重装linux,Acer-E5-572G笔记本U盘装原版win10系统教程
  16. 【分享】豆瓣上排名top100的书籍
  17. FileSplit cannot be cast Exception
  18. archlinux下Thinkpad的trackpoint配置
  19. 100ask imx6ull开发板移植NXP官方UBOOT
  20. 机器人编程语言有哪些? 这5大编程语言的优缺点你都了解?

热门文章

  1. 【Python】创建数组[[0]*n]*m与[[0 for _ in range(n)] for _ in range(m)]的区别
  2. 【Leetcode】几种简单的排序算法
  3. [云炬创业管理笔记]第四章把握创业机会测试3
  4. [云炬创业基础笔记]第二章创业者测试3
  5. [云炬看世界]个人站长
  6. 获取keras中间层输出、模型保存与加载
  7. Nhibernate 对view 查询的几种方法
  8. 应用程序通用开发框架
  9. Delphi中Tobject与Variant之间的转换
  10. 如何简化临时内存的分配与释放