说起来扩展,基本就是在其他语言里调用C或者C++,因为这两个是效率最高的代码,而其他大多都是另外又封装的,所以效率较低。

当出现语言本身无法解决的效率问题时,就需要扩展调用其他代码。

因为我自己会C++,所以我就只记录调用C++。

其中调用DLL最为简单,所以在此自己mark一下。

正文开始:

C++中生成DLL就不废话了。需要特别注意的是据我所知VS2010之前的版本貌似只能编译成32位的DLL,但是我的电脑安装的是64位的python,调用32位的就会出错。

解决办法就是用VS2010,在2010中可以编译成64位的DLL。具体方法是在上边的win32中选择编辑新的方式,里边可以选。

接下来举个简单例子

 1 //hello.h
 2 #ifdef EXPORT_HELLO_DLL
 3 #define HELLO_API __declspec(dllexport)
 4 #else
 5 #define HELLO_API __declspec(dllimport)
 6 #endif
 7 extern "C"
 8 {
 9  HELLO_API int IntAdd(int , int);
10 }
11
12 //hello.cpp
13 #define EXPORT_HELLO_DLL
14 #include "hello.h"
15 HELLO_API int IntAdd(int a, int b)
16 {
17  return a + b;
18 }

上述是两个文件,也就是C++中需要编译DLL的文件。

1 from ctypes import *
2 dll = cdll.LoadLibrary('hello.dll')
3 ret = dll.IntAdd(2, 4)
4 print(ret)

上述是调用DLL文件的代码,其实就是用到了ctypes库。

以上是一个"hello world"级别的程序,实际运用中更多的需要传递数据结构、字符串等,才能满足我们的需求。那么本示例将展示,如何传递数据结构参数,以及如何通过数据结构获取返回值。

 1 //hello.h
 2 #ifdef EXPORT_HELLO_DLL
 3 #define HELLO_API __declspec(dllexport)
 4 #else
 5 #define HELLO_API __declspec(dllimport)
 6 #endif
 7
 8 #define ARRAY_NUMBER 20
 9 #define STR_LEN 20
10
11 struct StructTest
12 {
13  int number;
14  char* pChar;
15  char str[STR_LEN];
16  int iArray[ARRAY_NUMBER];
17 };
18
19 extern "C"
20 {
21  //HELLO_API int IntAdd(int , int);
22  HELLO_API char* GetStructInfo(struct StructTest* pStruct);
23 }
24
25 //hello.cpp
26 #include <string.h>
27 #define EXPORT_HELLO_DLL
28 #include "hello.h"
29
30 HELLO_API char* GetStructInfo(struct StructTest* pStruct)
31 {
32  for (int i = 0; i < ARRAY_NUMBER; i++)
33  pStruct->iArray[i] = i;
34  pStruct->pChar = "hello python!";
35  strcpy (pStruct->str, "hello world!");
36  pStruct->number = 100;
37  return "just OK";
38 }

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;

最后要说一点,这些内容不是原创,只是我用别人的方法,自己验证时候遇到的问题,比如64位DLL的问题。

http://blog.csdn.net/bluehawksky/article/details/39082125 更详细的各种数据结构的传递可以看这个。

转载于:https://www.cnblogs.com/lixiaofou/p/7820380.html

10 python 扩展相关推荐

  1. Visual Studio Code 10 月 Python 扩展更新

    微软发布了 10 月的 Visual Studio Code Python 扩展更新,该版本包括支持原生编辑 Juypter Notebook,添加在终端中运行 Python 文件的按钮,以及改进 P ...

  2. vscode更改编码_装上后这 10个扩展后,VSCode 真的是无敌的存在

    转CSDN 装上后这 10个扩展后,VSCode 真的是无敌的存在​blog.csdn.net VS Code是目前最受欢迎的代码编辑器之一,也是大多数Web开发人员的首选武器.没错,它快速,高效并且 ...

  3. python扩展库安装

    [centos下python扩展库安装] pip 是 Python 包管理工具,提供了对Python 包的查找.下载.安装.卸载的功能. python.org 上最新版本的安装包,都已经自带了该工具. ...

  4. python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...

    [填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...

  5. visual studio code Python终端运行_VS Code 6 月 Python 扩展更新

    优质文章,第一时间送达! 微软发布了 6 月的 Visual Studio Code Python 扩展更新,此版本除了解决 53 个问题外,还开发了新功能,例如逐行运行和启动页面. 逐行运行(Run ...

  6. 安装python扩展库时只能使用pip_安装 Python 扩展库时只能使用 pip 工具在线安装,如果安装不成功就没有别的办法了。_学小易找答案...

    [单选题]关于Python中的复数,下列说法错误的是_________________. [填空题]在Python程序中,导入sys模块后,可以通过列表________________访问命令行参数. ...

  7. 爱因斯坦求和约定在Python扩展库Numpy中的实现

    推荐教材: <Python数据分析.挖掘与可视化>(慕课版)(ISBN:978-7-115-52361-7),董付国,人民邮电出版社,定价49.8元,2020年1月出版,2021年12月第 ...

  8. 使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年9月第10次印刷,山东省一流本 ...

  9. 怎么查看Python扩展库所有可用安装版本

    一般情况下安装Python扩展库时无需指定版本号,pip会自动找到与机器环境对应的最新版本进行安装,但有时为了某些特殊需要,可能需要了解相关模块有哪些历史版本,但pip好像并没有这样的功能.这里提供一 ...

最新文章

  1. xshell突出显示集
  2. 2021-01-20 Matlab画图技巧与实例:堆叠图stackedplot
  3. 常见的数据库管理系统排名(DBMS)
  4. 开关怎么使用_水龙头漏水怎么办?使用时把控开关力度很重要
  5. 排序算法(5)----堆排序
  6. 21 世纪最需要的 7 种人才素质 - 李开复
  7. EXCHANGE服务器灾难恢复
  8. 电子技术基础(三)__电路分析基础__电感元件
  9. 马氏距离(Mahalanobis Distance)
  10. 网站是备案域名还是服务器,网站备案是域名还是服务器
  11. 由Photoshop高反差保留算法原理联想到的一些图像增强算法
  12. 计算机考研院校录取人数,2010年计算机考研34所自主划线院校复试成绩及录取人数等详细情况汇总...
  13. 天天向上的力量python代码解释_python天天向上的力量
  14. 40家全球知名MCU生产厂商及其详细介绍
  15. Exchange Server2010系列之六:监控用户邮件
  16. python条件运算符_Python中的条件运算符
  17. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 WMT数据处理
  18. 梯形断面临界水深莫洛图
  19. 项目奖金要不要与合同额直接相关?
  20. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(17):函数矩阵的微分和积分

热门文章

  1. 远程计算机已结束连接解决方法
  2. Android中UI(View)的刷新
  3. oracle中to_date函数详解
  4. 深度学习 循环神经网络RNN
  5. Python——四大内置高阶函数(map、reduce、filter、sorted)
  6. Postman系列之基本操作及设置
  7. spring容器的懒加载
  8. A股开盘:深证区块链50指数跌0.46%,泰豪科技涨停
  9. 比特币链上活跃度下降,近24小时交易额约为1050.57亿美元
  10. MySQL高级知识(十二)——全局查询日志