本站消息

  出租广告位,需要合作请联系站长

  今日名言-想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗 。——马克斯威尔·马尔兹

  今日名言-用谅解、宽恕的目光和心理看人、待人。人就会觉得葱笼的世界里,春意盎然,到处充满温暖。——蔡文甫


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Windows平台搭建Swig环境示例,并且解决python无法返回double类型的问题

发布于2021-07-25 07:52     阅读(1130)     评论(0)     点赞(26)     收藏(5)


1. Windows下安装Swig

详情参考 https://blog.csdn.net/aganliang/article/details/91129379

2. 新建test.cpp文件

  1. #include "test.h"
  2. int addReturnInt(int a, int b)
  3. {
  4. return a + b;
  5. }
  6. void addPointerDouble(double& a, double& b, double& res)
  7. {
  8. res = a + b;
  9. }

新建test.h文件

  1. #ifndef TEST_H
  2. #define TEST_H
  3. int addReturnInt(int a, int b);
  4. #ifdef SWIG
  5. %apply double& INPUT{ double& a }
  6. %apply double& INPUT{ double& b }
  7. %apply double& INOUT{ double& res }
  8. #endif
  9. void addPointerDouble(double & a, double & b, double & res);
  10. #endif

新建test.i文件

  1. %module TestSwig
  2. %{
  3. #include "test.h"
  4. %}
  5. %include "test.h"

将这三个新建的文件放入一个文件夹中

3. 打开cmd命令行 cd进刚刚创建的文件夹内

执行swig命令

swig -c++ -python  test.i

执行完毕后,会在当前目录下生成一个名为test_wrap.cxx的文件以及TestSwig.py文件

4. 打开VS,新建一个C++空项目(控制台)

在菜单栏(正上方)设置为release x86, 将cxx文件,h文件,cpp文件添加进项目中

5. python环境配置:

  • 配置改为Release x86
  • 配置属性->常规->Windows SDK版本修改为【10.0.18362.0】或【最新安装版本】
  • 配置属性->常规->配置类型修改为【动态库(.dll)】
  • 配置属性->高级->目标文件扩展名修改为【.pyd】
  • 配置属性->C/C++->常规->附加包含目录->添加【D:\anconda\envs\py36\include】
  • 配置属性->VC++目录->库目录->添加【D:\anconda\envs\py36\libs】(即为python36.lib所在路径)
  • 配置属性->连接器->输入->附加依赖项->添加【python36.lib】

6. VS编译项目,点击生成选项,会在配置的输出目录中生成TestSwig.pyd文件。生成完毕之后将此文件重命名为_TestSwig.pyd(原因:与刚刚swig生成的py文件重名了,不利于调用)

7. 将pyd文件与生成的py文件放在同一个目录下

执行测试代码:

  1. import TestSwig
  2. a = 1
  3. b = 2
  4. res = TestSwig.addReturnInt(a, b)
  5. print('原生C++ int 返回:', type(res), res)
  6. print('-------------------------')
  7. a1 = 1.0
  8. a2 = 2.0
  9. res = 0.0
  10. # 这里的res是通过swig编译脚本里的INOUT关键字返回
  11. res = TestSwig.addPointerDouble(a1, a2, res) 的
  12. print('原生C++ double 引用返回:', type(res), res)

执行结果:

原生C++ int 返回: <class 'int'> 3
-------------------------
原生C++ double 引用返回: <class 'float'> 3.0

至此,python就可以调用c++封装的函数了


总结:

test.h中的swig宏是解决python类型中没有double类型返回的关键

  1. #ifdef SWIG
  2. %apply double& INPUT{ double& a }
  3. %apply double& INPUT{ double& b }
  4. %apply double& INOUT{ double& res }
  5. #endif
  6. 其中:% 与apply不能分离(这个巨坑,别问我怎么知道的)
  7. 参数与函数保持一致,如果函数入参为int这种非引用、指针类型的,可以不写入SWIG宏内
  8. INPUT代表输入输出,编译后的python得出结果需要返回(因为python没有显式的使用指针)
  9. OUTOUT代表输出,只能在python内return出结果
  10. INPUT代表输入,只能通过python赋值给C++函数参数

原文链接:https://blog.csdn.net/ws18921818762/article/details/119042239



所属网站分类: 技术文章 > 博客

作者:小可爱不要爱

链接:http://www.pythonpdf.com/blog/article/545/510028a8c49c9f2f4b98/

来源:编程知识网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)